1. ホーム
  2. swift

[解決済み] Swiftで関連オブジェクトを設定する方法はありますか?

2023-05-31 20:18:06

質問

Objective-Cから来た場合、関数 objc_setAssociatedObject を呼び出すことができます。これは、実行時にその参照も削除されるまでオブジェクトが破壊されたくない場合に便利です。Swiftはこれに類似した何かを持っていますか?

どのように解決するのですか?

以下は、シンプルですが、完全な例です。 jckarter の回答 .

既存のクラスに新しいプロパティを追加する方法を示しています。これは,拡張ブロックの中で計算されたプロパティを定義することによって行われます.計算されたプロパティは関連付けられたオブジェクトとして保存されます。

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)
        }
    }
}

EDITです。

初期化されていないプロパティの値の取得をサポートする必要がある場合、また、エラーの発生を避けるために unexpectedly found nil while unwrapping an Optional value というエラーを避けるために、ゲッターをこのように変更することができます。

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