协议 Protocol
使用 Protocol 关键字创建一个协议
让遵守该协议的 class 与 struct 实现约定一些方法与属性。
1 2 3 4 5 6 7 8 9 10 11
| protocol PageNumberProtocol { /// 添加的实例属性 var pageNumber: Int { get set } /// 添加的实例方法 func add()
/// 添加的类属性 static var name: String? { get set } /// 添加的类方法 static func logName() }
|
遵守协议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| struct Person: PageNumberProtocol { var pageNumber: Int
func add() {}
static var name: String?
static func logName() {} }
class Car: PageNumberProtocol { var pageNumber: Int = 0
func add() {}
static var name: String?
static func logName() {} }
|
扩展 extension
扩展使用的很多应该都很熟悉
分散代码实现
1 2 3 4 5 6
| extension Car { func dididi() { print("滴滴滴") } }
|
使用
Protocl + Extension
给出协议并实现协议,这样遵守协议的 class 和 struct 就能直接使用协议方法。
runtime 添加属性
1 2 3 4 5 6 7
| func getAssociatedObject<T>(_ object: Any, _ key: UnsafeRawPointer) -> T? { return objc_getAssociatedObject(object, key) as? T }
func setRetainedAssociatedObject<T>(_ object: Any, _ key: UnsafeRawPointer, _ value: T) { objc_setAssociatedObject(object, key, value, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
|
协议
1 2 3 4 5 6 7 8 9 10 11 12
| protocol PageNumberProtocol { /// 添加的实例属性 var pageNumber: Int { get set } /// 添加的实例方法 func add()
/// 添加的类属性 static var name: String? { get set } /// 添加的类方法 static func logName() }
|
扩展遵守协议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| private var pageNumberKey: Void?
private var nameKey: Void?
extension UIViewController: PageNumberProtocol { static func logName() { debugPrint(name ?? "无名") }
static var name: String? { get { getAssociatedObject(self, &nameKey) } set { setRetainedAssociatedObject(self, &nameKey, newValue) } }
func add() { pageNumber += 1 }
var pageNumber: Int { get { getAssociatedObject(self, &pageNumberKey) ?? 0 } set { setRetainedAssociatedObject(self, &pageNumberKey, newValue) } } }
|
这样所有遵守 PageNumberProtocol 协议的 UIViewController 就都有了协议要求的属性与方法且已经实现了。