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
吧,它就是我们的目标类/实例
。
网友评论