Swift 使用拓展协议实现category

在第三方库中可以经常看到 拓展协议 的写法 ,比如在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()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容