美文网首页
Swift 定义命名空间

Swift 定义命名空间

作者: foolish_hungry | 来源:发表于2019-02-02 16:37 被阅读0次

    使用过第三方 KingFisher的小伙伴, 肯定使用过 ImageView.kf 吧,这个是怎么实现的呢? 为啥要这么做呢?

    虽然 Swift 不像OC那样, 只有一个命名空间, Swift 一个 module 就代表一个命名空间。

    既然是引入的第三方库, 本来就是一个module, 其实不需要添加 kf 这样的关键字, 也不会和项目中的类或者方法名等造成命名冲突, 但是为了使用上引起不必要的理解冲突, 我们定义这样的命名空间, 使得代码的可读性增强。

    定义命名空间, 需要做的有以下操作

    • 定义一个泛型类
    public struct YongHandel<Base> {
        public var base: Base
    
        public init(_ base: Base) {
            self.base = base
        }
    }
    

    其中 YongHandel 可以指定为 module 的名称, 还有一个存储属性, 一个初始化方法;

    • 定义一个 泛型协议
    public protocol YongHandelCompatible {
        associatedtype CompatibleType
        
        static var yh: CompatibleType.Type { get }
        var yh: CompatibleType { get }
    }
    

    其中 定义关联类型 CompatibleType, 一个只读类计算属性 yh, 一个只读的实例计算属性 yh;

    • 定义协议的默认扩展属性
    extension YongHandelCompatible {
        public static var yh: YongHandel<Self>.Type {
            return YongHandel.self
        }
        
        public var yh: YongHandel<Self> {
            return YongHandel(self)
        }
    }
    

    其中类计算属性, 返回类本身, 实例计算属性, 返回类的实例;

    至此我们的命名空间定义完成

    如何去使用呢?

    • 给 UIcolor 添加命名空间

    定义:

    extension UIColor: YongHandelCompatible { }
    
    extension YongHandel where Base == UIColor {
        
        public static var themeColor: UIColor {
            return UIColor.red
        }
        
        public var backColor: UIColor {
            return UIColor.purple
        }
    }
    

    使用:

    view.backgroundColor = UIColor.yh.themeColor
    
    • 给 String 添加命名空间
    extension String: YongHandelCompatible { }
    
    extension YongHandel where Base == String {
        
        public static var toolTip: String {
            return "hello world"
        }
        
        public var message: String {
            return "真好用"
        }
    }
    

    使用

    let str = String.yh.toolTip
    

    参考 KingFisher

    相关文章

      网友评论

          本文标题:Swift 定义命名空间

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