Swift中更优雅的为类扩展属性方法

721 阅读1分钟

Swift中更优雅的为类扩展属性方法

背景: 项目中,经常需要为类扩展一些属性或方法,以前在OC中,我们都是xx_funcName、xx_varName,比较常见的如Masonry的mas_right等,到了Swift,SnapKit早期是snp_leading,后来换成了make.snp.right这种更加优雅的写法,本文介绍给类扩展方法时,如何加上自己的前缀。

定义前缀类型

 struct CQ<Base> {
    public var base: Base
    public init(_ base: Base) {
        self.base = base
    }
 }

利用协议扩展前缀属性

 protocol CQCompatible {}

extension CQCompatible {
    public var cq: CQ<Self> {
        set {}
        get {
            CQ(self)
        }
    }
    
    public static var cq: CQ<Self>.Type {
        set {}
        get {
            CQ<Self>.self
        }
    }
}

使用示例1

给String实例扩展一个属性,获取字符串里数字的数量

extension String: CQCompatible {}
extension CQ where Base == String {
    var numberCount: Int {
        base.filter { (c) in
            ("0"..."9").contains(c)
        }.count
    }
}

print("123456das789".cq.numberCount)

使用示例2

给UIImage扩展一个类方法,传入颜色返回UIImage

extension UIImage: CQCompatible {}

extension CQ where Base == UIImage {
    static func color(_ color: UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.main.scale)
        let ctx = UIGraphicsGetCurrentContext()
        ctx?.setFillColor(color.cgColor)
        ctx?.fill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

UIImage.cq.color(RGB(51, 51, 51))

总结: 最后,Demo地址