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

  • 相关阅读:
    BadgeView使用
    设计模式(一)单例模式的七种写法
    Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
    AsyncTask源码分析
    Android微信支付—注意事项
    Android微信支付SDK开发
    Android支付宝SDK开发笔记
    onInterceptTouchEvent与onTouchEvent默认返回值
    线程间的通信方式3--Handler
    Android应用程序启动过程(二)分析
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9924190.html
Copyright © 2020-2023  润新知