@autoclosure 和 ??
自动关闭关键字
@autoclosure 使用与参数类型的()-> T 的闭包 ,这个闭包的参数为空,带有参数的闭包是不能使用这个关键字的
//原始写法
func logIfTrue(_predicate: () ->Bool){
if predicate() {
print("True")
}
}
//调用方法1
logIfTrue{ () ->Bool in
return 2>1
}
//调用方法2省略参数和返回值
logIfTrue({
return2>1
})
//调用方法3省略参数和返回值和return
logIfTrue({2>1})
//调用方法4尾随闭包
logIfTrue{2>1}
//使用@autoclosure关键字
func logIfTrue2(_predicate:@autoclosure() ->Bool){
if predicate() {
print("True")
}else{
print("False")
}
}
// Swift将会把2 > 4这个表达式自动转换为()->Bool。这样我们就得到了一个写法简单,表意清楚的式子。
logIfTrue2(2>4)
?? 的其中一个定义如下
func??(optional:T?, defaultValue :@autoclosure()->T) ->T{
switchoptional {
case.some(let value):
returnvalue
case.none:
returndefaultValue()
}
}
//这里使用的defaultValue是一个()->T类型的闭包,使用闭包的原因是,optional可能是optional类型,如果解包后是有值得,并且后面的defaultValue是一个需要计算的备选值,就不用后面的计算了,如果解包为nil,在进行计算,这样做事为了性能。
//这里使用的??,前后两个都是他的参数,一个是optional类型,一个是()->T类型的
类似的操作符, && || 这两个方法也是这样
??, &&, ||, ! 是定义在 Bool 结构体中的方法 == 是定义在 Bool 拓展中
对应的 | , & 是定义在 Int 结构体中