@autoclosure 和 ??

2017-02-03  本文已影响21人  fordring2008

自动关闭关键字

@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 结构体中

上一篇下一篇

猜你喜欢

热点阅读