为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

精慕HU 2019-07-31 18:39:46
如何在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()         ...     }}有任何想法吗?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

与Objective-C一样,您无法将存储的属性添加到现有类中。如果您正在扩展Objective-C类(UIView肯定是一个),您仍然可以使用关联对象来模拟存储的属性:


对于Swift 1


import ObjectiveC


private var xoAssociationKey: UInt8 = 0


extension 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和3


import ObjectiveC


private var xoAssociationKey: UInt8 = 0


extension 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

        }

    }

}


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 805 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信