使用過(guò)第三方 KingFisher的小伙伴, 肯定使用過(guò) ImageView.kf 吧,這個(gè)是怎么實(shí)現(xiàn)的呢硝烂? 為啥要這么做呢?
雖然 Swift 不像OC那樣躯舔, 只有一個(gè)命名空間, Swift 一個(gè) module 就代表一個(gè)命名空間省古。
既然是引入的第三方庫(kù)粥庄, 本來(lái)就是一個(gè)module, 其實(shí)不需要添加 kf 這樣的關(guān)鍵字豺妓, 也不會(huì)和項(xiàng)目中的類(lèi)或者方法名等造成命名沖突惜互, 但是為了使用上引起不必要的理解沖突, 我們定義這樣的命名空間琳拭, 使得代碼的可讀性增強(qiáng)训堆。
定義命名空間, 需要做的有以下操作
- 定義一個(gè)泛型類(lèi)
public struct YongHandel<Base> {
public var base: Base
public init(_ base: Base) {
self.base = base
}
}
其中 YongHandel 可以指定為 module 的名稱(chēng)白嘁, 還有一個(gè)存儲(chǔ)屬性蔫慧, 一個(gè)初始化方法;
- 定義一個(gè) 泛型協(xié)議
public protocol YongHandelCompatible {
associatedtype CompatibleType
static var yh: CompatibleType.Type { get }
var yh: CompatibleType { get }
}
其中 定義關(guān)聯(lián)類(lèi)型 CompatibleType权薯, 一個(gè)只讀類(lèi)計(jì)算屬性 yh, 一個(gè)只讀的實(shí)例計(jì)算屬性 yh睡扬;
- 定義協(xié)議的默認(rèn)擴(kuò)展屬性
extension YongHandelCompatible {
public static var yh: YongHandel<Self>.Type {
return YongHandel.self
}
public var yh: YongHandel<Self> {
return YongHandel(self)
}
}
其中類(lèi)計(jì)算屬性盟蚣, 返回類(lèi)本身, 實(shí)例計(jì)算屬性卖怜, 返回類(lèi)的實(shí)例屎开;
至此我們的命名空間定義完成
如何去使用呢?
- 給 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