在第三方库中可以经常看到 拓展协议 的写法 ,比如在RxSwift中的:
let text = usernameLabel.rx.text.orEmpty.asObservable()
在 SnapKit 中的
className.snp.makeConstraints
可以看出这些都是通过 '.' 点语法来出发调用的 ,这说明命名空间: rx、snp 其实就是一个数据结构
代码实现:
新建一个.swift 文件,声明协议和命名空间结构体
protocol NameSpaceProtocol {
//协议关联泛型 T
associatedtype T
//定义类型为泛型的计算属性
var ib:T {get}
}
//协议拓展 使遵循协议的对象 生成一个结构体保存调用者的地址
extension NameSpaceProtocol {
//Self:当前遵循这个协议的类
var ib :IBNameSpaceStruct<Self> {
//self:当前类实例
return IBNameSpaceStruct(value:self)
}
}
//结构体 用来保存一份对象地址 (结构体<T>:传入要保存的类型(T))
public struct IBNameSpaceStruct<T>:NameSpaceProtocol {
var ib: T
init(value:T) {
self.ib = value
}
}
新建 .swift 文件 ,对需要的类进行拓展
//遵循协议 生成ib这个结构体
extension String :NameSpaceProtocol {
}
//对String 增加方法
extension IBNameSpaceStruct where T == String {
func myFunc() {
print(self.ib)
}
}
调用方法
let string = "123"
string.ib.myFunc()
网友评论