Swift|Swift 定义命名空间

使用过第三方 KingFisher的小伙伴, 肯定使用过 ImageView.kf 吧,这个是怎么实现的呢? 为啥要这么做呢?
虽然 Swift 不像OC那样, 只有一个命名空间, Swift 一个 module 就代表一个命名空间。
既然是引入的第三方库, 本来就是一个module, 其实不需要添加 kf 这样的关键字, 也不会和项目中的类或者方法名等造成命名冲突, 但是为了使用上引起不必要的理解冲突, 我们定义这样的命名空间, 使得代码的可读性增强。
定义命名空间, 需要做的有以下操作
  • 定义一个泛型类
public struct YongHandel { public var base: Basepublic init(_ base: Base) { self.base = base } }

其中 YongHandel 可以指定为 module 的名称, 还有一个存储属性, 一个初始化方法;
  • 定义一个 泛型协议
public protocol YongHandelCompatible { associatedtype CompatibleTypestatic var yh: CompatibleType.Type { get } var yh: CompatibleType { get } }

其中 定义关联类型 CompatibleType, 一个只读类计算属性 yh, 一个只读的实例计算属性 yh;
  • 定义协议的默认扩展属性
extension YongHandelCompatible { public static var yh: YongHandel.Type { return YongHandel.self }public var yh: YongHandel { 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

【Swift|Swift 定义命名空间】参考 KingFisher

    推荐阅读