swift-命名空间

2021-06-21  本文已影响0人  GitArtOS

1.定义命名空间

1.1 定义公式
/// 类型协议
protocol TypeWrapperProtocol {
    associatedtype WrappedType
    var wrappedValue: WrappedType { get }
    init(value: WrappedType)
}

struct NamespaceWrapper<T>: TypeWrapperProtocol {
    let wrappedValue: T
    init(value: T) {
        self.wrappedValue = value
    }
}

需要什么样的命名空间,就把其中的rx改成你希望的名字。

1.2 具体实例

/// 命名空间协议
protocol NamespaceWrappable {
    associatedtype WrapperType
    var rx: WrapperType { get }
    static var rx: WrapperType.Type { get }
}

extension NamespaceWrappable {
    var rx: NamespaceWrapper<Self> {
        return NamespaceWrapper(value: self)
    }
    static var rx: NamespaceWrapper<Self>.Type {
        return NamespaceWrapper.self
    }
}

2. 使用命名空间

实际上我们需要扩展的类不是需要命名空间的这个类,而是协议

2.1 让需要扩展的类遵循协议NamespaceWrappable;
extension UIColor: NameSpaceWrappable {}
2.2 扩展协议TypeWrapperProtocol
extension TypeWrapperProtocol where WrappedType == UIColor {
    /// 用自身颜色生成UIImage
    var image: UIImage? {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(wrappedValue.cgColor)
        context?.fill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image
    }
}

在扩展的方法中,self代表的是协议,而不是目标扩展类。那要用到self怎么办?用wrappedValue吧,它就是我们的目标类/实例

上一篇 下一篇

猜你喜欢

热点阅读