美文网首页
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