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:当前类实例
        return IBNameSpaceStruct(value:self)
    }
}

//结构体 用来保存一份对象地址 (结构体:传入要保存的类型(T))
public struct IBNameSpaceStruct: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)