Then Github地址,是一个很好用的初始化语法糖协议,可以在初始化之后很方便的设置相关的属性,并且将设置属性代码全部内聚在closure
中,使代码看上去清晰明了。下面简单看看Then的使用
let label = UILabel().then {
$0.textColor = UIColor.black
$0.font = UIFont.systemFont(ofSize: 15)
$0.textAlignment = .left
$0.text = "default text"
}
在Then协议中有三个方法
with & do
extension Then where Self: Any {
/// Makes it available to set properties with closures just after initializing and copying the value types.
///
/// let frame = CGRect().with {
/// $0.origin.x = 10
/// $0.size.width = 100
/// }
public func with(_ block: (inout Self) throws -> Void) rethrows -> Self {
var copy = self
try block(©)
return copy
}
public func `do`(_ block: (Self) throws -> Void) rethrows {
try block(self)
}
}
with
和do
方法是对Any
任意类型的扩展,只要该类型遵循了Then
协议就可以使用with
和do
方法从
with
方法的实现我们能够看出来,先对执行with
方法的实例做了一次复制,得到一个新的实例copy
,然后再将拷贝所得的实例copy
传递给block,copy
将作为block中后续设置的参数,最后将被block执行之后的copy
返回。如果copy是值类型那么执行with
之后将得到一个新的实例,如果copy
是引用类型那么执行with
方法之后返回还是它自己。
then
extension Then where Self: AnyObject {
/// Makes it available to set properties with closures just after initializing.
///
/// let label = UILabel().then {
/// $0.textAlignment = .Center
/// $0.textColor = UIColor.blackColor()
/// $0.text = "Hello, World!"
/// }
public func then(_ block: (Self) throws -> Void) rethrows -> Self {
try block(self)
return self
}
}
then
方法是对AnyObject
的扩展,也就是说只有遵循了Then
协议的class
的实例即对象才能使用then
方法,而值类型的实例是不能使用then
方法的