如何在Swift中存储属性,就像我在Objective-C上一样?

如何在Swift中存储属性,就像我在Objective-C上一样?

我正在将一个应用程序从Objective-C切换到Swift,我有几个带有存储属性的类别,例如:

@interface UIView (MyCategory)- (void)alignToView:(UIView *)view
          alignment:(UIViewRelativeAlignment)alignment;- (UIView *)clone;@property (strong) PFObject *xo;@property (nonatomic) BOOL isAnimating;@end

由于Swift扩展不接受这些存储的属性,我不知道如何维护与Objc代码相同的结构。存储的属性对我的应用程序非常重要,我相信Apple必须在Swift中创建一些解决方案。

正如jou所说,我所寻找的实际上是使用关联对象,所以我做了(在另一个上下文中):

import Foundationimport QuartzCoreimport ObjectiveCextension CALayer {
    var shapeLayer: CAShapeLayer? {
        get {
            return objc_getAssociatedObject(self, "shapeLayer") as? CAShapeLayer
        }
        set(newValue) {
            objc_setAssociatedObject(self, "shapeLayer", newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }

    var initialPath: CGPathRef! {
        get {
            return objc_getAssociatedObject(self, "initialPath") as CGPathRef
        }
        set {
            objc_setAssociatedObject(self, "initialPath", newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }}

但是在执行以下操作时我得到了EXC_BAD_ACCESS:

class UIBubble : UIView {
    required init(coder aDecoder: NSCoder) {
        ...
        self.layer.shapeLayer = CAShapeLayer()
        ...
    }}

有任何想法吗?


精慕HU
浏览 806回答 3
3回答

海绵宝宝撒

与Objective-C一样,您无法将存储的属性添加到现有类中。如果您正在扩展Objective-C类(UIView肯定是一个),您仍然可以使用关联对象来模拟存储的属性:对于Swift 1import ObjectiveCprivate var xoAssociationKey: UInt8 = 0extension UIView {    var xo: PFObject! {        get {            return objc_getAssociatedObject(self, &xoAssociationKey) as? PFObject        }        set(newValue) {            objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN))        }    }}关联键是一个指针,应该是每个关联的唯一指针。为此,我们创建一个私有全局变量,并使用它的内存地址作为&运算符的键。有关如何在Swift中处理指针的详细信息,请参阅使用Swift with Cocoa和Objective-C 。更新为Swift 2和3import ObjectiveCprivate var xoAssociationKey: UInt8 = 0extension UIView {    var xo: PFObject! {        get {            return objc_getAssociatedObject(self, &xoAssociationKey) as? PFObject        }        set(newValue) {            objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)        }    }}更新为Swift 4在Swift 4中,它更加简单。Holder结构将包含我们的计算属性将向世界公开的私有值,从而产生存储属性行为的错觉。资源extension UIViewController {    struct Holder {        static var _myComputedProperty:Bool = false    }    var myComputedProperty:Bool {        get {            return Holder._myComputedProperty        }        set(newValue) {            Holder._myComputedProperty = newValue        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP