Swift では、ストアド属性をエクステンションに直接追加することはできません。しかし、現実の世界では、すでに作成されたクラスに新しいストアド属性を追加するために拡張機能を使用することは一般的です。例えば、異なる UIView インスタンスを区別するために、UIView クラスに identifier 属性を追加します。
Extensions must not contain stored properties
UIViewの拡張子で直接追加すると、コンパイラは.NET Frameworkを報告します。下図のようになります:
ストレージ属性の識別子を直接定義することはできないので、アソシエーション属性を使って目的の機能を実現します。コードは以下のようになります:
public extension UIView {
private struct AssociatedKey {
static var identifier: String = "identifier"
}
public var identifier: String {
get {
return objc_getAssociatedObject(self, &AssociatedKey.identifier) as? String ?? ""
}
set {
objc_setAssociatedObject(self, &AssociatedKey.identifier, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
}
}
}
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("view's identifier:\(self.view.identifier)")
view.identifier = "root view"
print("view's identifier:\(self.view.identifier)")
}
}
Result: ----------------------
view's identifier:
view's identifier:root view