zoukankan      html  css  js  c++  java
  • 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 protocol NamespaceWrappable {
        associatedtype WrapperType
        var hk: WrapperType { get }
        static var hk: WrapperType.Type { get }
    }
    
    public extension NamespaceWrappable {
        var hk: NamespaceWrapper<Self> {
            return NamespaceWrapper(value: self)
        }
    
        static var hk: NamespaceWrapper<Self>.Type {
            return NamespaceWrapper.self
        }
    }
    
    public protocol TypeWrapperProtocol {
        associatedtype WrappedType
        var wrappedValue: WrappedType { get }
        init(value: WrappedType)
    }
    
    public struct NamespaceWrapper<T>: TypeWrapperProtocol {
        public let wrappedValue: T
        public init(value: T) {
            self.wrappedValue = value
        }
    }

    extension String: NamespaceWrappable { }
    extension TypeWrapperProtocol where WrappedType == String {
        var test: String {
            return wrappedValue
        }
    }

  • 相关阅读:
    mark::开源绘图工具graphviz
    bzoj1013球形空间产生器sphere 高斯消元(有系统差的写法
    背包专题练习
    仿射加密与S-DES加密算法的实现
    1178:成绩排序
    1177:奇数单增序列
    1176:谁考了第k名
    1311:【例2.5】求逆序对
    1310:【例2.2】车厢重组
    1175:除以13
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9924190.html
Copyright © 2011-2022 走看看