関連オブジェクトを使用して 2 つの新しいプロパティを追加した ViewController があります: 列挙型と文字列 (文字列バージョンはhereから取得されます)
これが私のコード例です:
extension UIViewController {
private struct AssociatedKeys {
static var handle = "handle"
}
enum CustomStringEnum: String {
case One = "One"
case Two = "Two"
case Three = "Three"
}
var customEnum: CustomStringEnum {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.handle) as? CustomStringEnum ?? .One
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.handle, newValue.rawValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
var descriptiveName: String {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.handle) as! String
}
set {
objc_setAssociatedObject(
self,
&AssociatedKeys.handle,
newValue as NSString?,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC
)
}
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let vc = UIViewController()
vc.customEnum = .Three
vc.descriptiveName = "Three"
print(vc.customEnum.rawValue) // -> This prints "One"
print(vc.descriptiveName) // -> This prints "Three"
}
}
文字列バージョンは正しく機能しますが、列挙型は機能しません。そして、何が問題なのかわかりません。
objc_getAssociatedObject
または の問題objc_setAssociatedObject
です。get version は常に nil のように見えるため、既定値の One が返されます。