第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

有沒有辦法在Swift中設(shè)置關(guān)聯(lián)對象?

有沒有辦法在Swift中設(shè)置關(guān)聯(lián)對象?

月關(guān)寶盒 2019-10-16 14:12:27
來自目標C的您可以objc_setAssociatedObject在2個對象之間調(diào)用函數(shù)以使它們維護一個引用,如果在運行時您不希望在刪除其引用之前也不要破壞某個對象的話,這會很方便。迅捷有與此類似的東西嗎?
查看完整描述

3 回答

?
溫溫醬

TA貢獻1752條經(jīng)驗 獲得超4個贊

它顯示了如何向現(xiàn)有類添加新屬性。它通過在擴展塊中定義計算屬性來實現(xiàn)。計算的屬性存儲為關(guān)聯(lián)的對象:


import ObjectiveC


// Declare a global var to produce a unique address as the assoc object handle

private var AssociatedObjectHandle: UInt8 = 0


extension MyClass {

? ? var stringProperty:String {

? ? ? ? get {

? ? ? ? ? ? return objc_getAssociatedObject(self, &AssociatedObjectHandle) as! String

? ? ? ? }

? ? ? ? set {

? ? ? ? ? ? objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)

? ? ? ? }

? ? }

}

編輯:


如果需要支持獲取未初始化屬性的值并避免發(fā)生錯誤unexpectedly found nil while unwrapping an Optional value,則可以按以下方式修改getter:


? ? get {

? ? ? ? return objc_getAssociatedObject(self, &AssociatedObjectHandle) as? String ?? ""

? ? }


查看完整回答
反對 回復(fù) 2019-10-16
?
小怪獸愛吃肉

TA貢獻1852條經(jīng)驗 獲得超1個贊

該解決方案還支持所有值類型,不僅支持自動橋接的值類型,例如String,Int,Double等。


包裝紙


import ObjectiveC


final class Lifted<T> {

    let value: T

    init(_ x: T) {

        value = x

    }

}


private func lift<T>(x: T) -> Lifted<T>  {

    return Lifted(x)

}


func setAssociatedObject<T>(object: AnyObject, value: T, associativeKey: UnsafePointer<Void>, policy: objc_AssociationPolicy) {

    if let v: AnyObject = value as? AnyObject {

        objc_setAssociatedObject(object, associativeKey, v,  policy)

    }

    else {

        objc_setAssociatedObject(object, associativeKey, lift(value),  policy)

    }

}


func getAssociatedObject<T>(object: AnyObject, associativeKey: UnsafePointer<Void>) -> T? {

    if let v = objc_getAssociatedObject(object, associativeKey) as? T {

        return v

    }

    else if let v = objc_getAssociatedObject(object, associativeKey) as? Lifted<T> {

        return v.value

    }

    else {

        return nil

    }

}

可能的 Class擴展(用法示例)


extension UIView {


    private struct AssociatedKey {

        static var viewExtension = "viewExtension"

    }


    var referenceTransform: CGAffineTransform? {

        get {

            return getAssociatedObject(self, associativeKey: &AssociatedKey.viewExtension)

        }


        set {

            if let value = newValue {

                setAssociatedObject(self, value: value, associativeKey: &AssociatedKey.viewExtension, policy: objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)

            }

        }

    }

}


查看完整回答
反對 回復(fù) 2019-10-16
?
浮云間

TA貢獻1829條經(jīng)驗 獲得超4個贊

顯然,這僅適用于Objective-C對象。經(jīng)過一些擺弄之后,以下是在Swift中進行調(diào)用的方法:


import ObjectiveC


// Define a variable whose address we'll use as key.

// "let" doesn't work here.

var kSomeKey = "s"



func someFunc() {

    objc_setAssociatedObject(target, &kSomeKey, value, UInt(OBJC_ASSOCIATION_RETAIN))


    let value : AnyObject! = objc_getAssociatedObject(target, &kSomeKey)

}


查看完整回答
反對 回復(fù) 2019-10-16
  • 3 回答
  • 0 關(guān)注
  • 629 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號