关联对象

Swift 中的 Runtime

夙愿已清 提交于 2019-12-05 03:59:44
即使在 Swift APP 中没有一行 Object-c 的代码,每个 APP 也都会在 Object-c runtime 中运行,为动态任务分发和运行时对象关联开启了一个世界。更确切地说,可能在仅使用 Swift 库的时候只运行 Swift runtime。但是使用 Objective-C runtime 这么长时间,我们也应该让他充分发挥其作用。 下面我们将以 Swift 的视角来观察关联对象(associated objects])和方法交叉(method swizzling) 这两个在运行时的技术。 ####关联对象(Associated Objects) Swift extension 可以给已经存在 Cocoa 类添加极为丰富的功能,具体有: (1)添加计算实例属性 ( computed property) 和计算类属性 (2)定义实例方法和类方法 (3)提供新的构造器 (4)定义下标(subscript) (5)定义和使用新的嵌套类型 (6)使一个遵守某个接口 相比之下, Objective-C 的 category 就逊色多了。比如说 Objective-C 中的 extension 就无法向既有类添加属性。 庆幸的是 Objective-C 的 关联对象(Associated Objects) 可以改善这个缺憾。例如要向一个工程里所有的 view