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地址