亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在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 關注
  • 864 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號