extension可以为类添加新的方法,但是如果想要添加数据成员的话就会被阻止,比如如下代码:
extension Foo {
var _title: String?
var title: String? {
get {
return _title
}
set {
_title = newValue
}
}
}复制代码
报错为:
Extensions may not contain stored properties复制代码
就是说,通过extension无法直接为类添加数据成员。
然而,需求是客观存在的,在多个扩展方法之间共享一些数据成员是必要的。这就需要使用一些动态修改类的方法。具体来说,就是使用一对看起来奇奇怪怪的方法:
objc_getAssociatedObject/objc_setAssociatedObject复制代码
可执行代码如下:
class Foo {
}
var key: Void?
extension Foo {
var Bar: String? {
get {
return objc_getAssociatedObject(self, &key) as? String
}
set {
objc_setAssociatedObject(self,&key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window : UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let a = Foo()
a.Bar = "good wood"
if let Bar = a.Bar {
print("Bar: \(Bar)")
} else {
print("没有设置")
}
return true
}
}复制代码
方法组objc_getAssociatedObject/objc_setAssociatedObject提供了类的动态性,因此有一定的实用价值。