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