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

  • 相关阅读:
    谈URL中末尾斜杠对SEO的影响
    ORDER BY一个较高级的用法
    MYSQL5.5 提示 Mysq error:Cannot load from mysql.proc
    mysql 数据库信息泄露
    [转]PclZip简介与使用
    通过telnet命令查看memcache运行状态
    [转载]PHP上传问题总结(文件大小检测,大文件上传)
    Silex 基于Symfony2组件的微型框架
    [转]推荐一些不错的计算机书籍
    [转]Beanstalkd简介(job生命周期)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9924190.html
Copyright © 2020-2023  润新知