swift 名稱空間實現的設計思考:extension YKKit where Base == String
設計問題:誰來構造、構造什麼、怎麼新增新功能
關鍵詞:本體、客體、構造、對映、功能。
別名:橋接變數、型變變數、容器變數、適配變數,構造變數;
目的:新增名稱空間、新增新功能。
原則:不修改本體的實現。
原始版本:
在本體的擴充套件中,直接構造客體;客體的構造器輸入參量為主體;
客體為具體類,直接完成本體想要完成的功能;
版本升級一:客體泛型化
目的:客體的功能實現脫離
// 客體
public final class YKKit<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
}
//構造器
public var yk: YKKit<Self>{
get { return YKKit(self) }
}
版本升級二:構造器泛型化(構造器功能分離)
// 定義泛型協議
public protocol YKKitCompatible {
associatedtype CompatibleType
var yk: CompatibleType { get }
}
// 協議的擴充套件
public extension YKKitCompatible {
public var yk: YKKit<Self>{
get { return YKKit(self) }
}
}
// 實現名稱空間yk
extension String: YKKitCompatible {}
版本升級三:客體協議化
public struct NamespaceWrapper<T>: TypeWrapperProtocol {
public let wrappedValue: T
public init(value: T) {
self.wrappedValue = value
}
}
public protocol TypeWrapperProtocol {
associatedtype WrappedType
var wrappedValue: WrappedType { get }
init(value: WrappedType)
}