1. 程式人生 > >swift 名稱空間實現的設計思考:extension YKKit where Base == String

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)

}