美文网首页
Swift 使用拓展协议实现category

Swift 使用拓展协议实现category

作者: IT_Bear_ | 来源:发表于2019-04-26 16:33 被阅读0次

在第三方库中可以经常看到 拓展协议 的写法 ,比如在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()

相关文章

网友评论

      本文标题:Swift 使用拓展协议实现category

      本文链接:https://www.haomeiwen.com/subject/atzfnqtx.html