iOS - Swift协议库Then的用法
2022-04-15 本文已影响0人
俺不是大佬儿
最近在学习Swift开发项目,一些常用的第三方库也在尝试使用,好的类库可以提高代码质量开拓编程思路,今天分享Then初始化库
原理:定义了一个Then协议,对Then协议进行扩展并指定约束范围为AnyObject、Any并利用闭包地形式在类实例、结构体实例初始化时返回了实例本身,由于库中让NSObject遵循Then协议所以对所有继承自NSObject的类型初始化都可用
用法
1.无需名参数使用$0替代
private lazy var searchBtn = UIButton().then {
$0.setImage(UIImage(named: "classify_search_btn"), for: .normal)
$0.setTitle("忍者", for: .normal)
$0.setTitleColor(UIColor.white, for: .normal)
$0.titleLabel?.font = UIFont.systemFont(ofSize: 13)
$0.titleLabel?.textAlignment = NSTextAlignment.left
$0.backgroundColor = UIColor(r: 1, g: 1, b: 1, a: 0.5)
$0.backgroundColor = .theme_color
}
在闭包外初始化一个searchBtn对象,再传进闭包进行设值,统一用取参数$0代替对象searchBtn
2.显式命名参数
private lazy var VIPBtn = UIButton().then { btn
in
btn.imagePosition(style: .left, spacing: 3.0)
btn.setImage(UIImage(named: "home_2_default"), for: .normal)
btn.setTitle("VIP", for: .normal)
btn.setTitleColor(.white, for: .normal)
btn.titleLabel?.font = .systemFont(ofSize: 14)
}
正常在使用lazy进行懒加载的初始化方式需要用下面的形式
private lazy var VIPBtn: UIButton = {
let btn = UIButton()
btn.imagePosition(style: .left, spacing: 3.0)
btn.setImage(UIImage(named: "home_2_default"), for: .normal)
btn.setTitle("VIP", for: .normal)
btn.setTitleColor(.white, for: .normal)
btn.titleLabel?.font = .systemFont(ofSize: 14)
return btn
}()
需要在闭包中初始化 let btn = UIButton()
并最后return btn
对于储值类型的结构体同样可以使用,用with
协议方法
let dframe = CGRect().with{
$0.origin.x = 12
$0.size.width = 20
}
let dframe = CGRect().with { f in
f.size.width = 10
f.size.height = 20
f.origin.x = 30
f.origin.y = 12
}
直接在闭包内执行操作
let usera = UserDefaults.standard.then { u in
u.set("swift", forKey: "username")
u.set("study", forKey: "password")
u.synchronize()
}
let user = UserDefaults.standard.do {
$0.set("swift", forKey: "username")
$0.set("study", forKey: "password")
$0.synchronize()
}