使用过第三方 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
网友评论