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
        }
    }

  • 相关阅读:
    关于背包DP的几点总结
    C++ P1510 精卫填海
    C++ P1060 开心的金明
    C++ P2613 【模板】有理数取余
    C++ P3811 【模板】乘法逆元
    C++ P1865 A % B Problem
    【转】char码值对应列表大全
    JDK和JVM
    如何打包成jar包自己看呢?
    java的真相
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9924190.html
Copyright © 2011-2022 走看看