Swift不允许在extension
中直接添加「存储属性」。但是在我们的实际开发中经常会用到使用extension
来给已经创建好的类添加新的「存储属性」。例如,给UIView
类添加一个identifier
属性来区别不同UIView
实例。
如果直接在UIView
的extension
中添加,编译器会报Extensions must not contain stored properties
。如下图:
既然不能直接定义存储属性identifier
,我们可以使用关联属性来实现想要的功能。代码如下:
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