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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1:自动闭包,顾名思义是一种自动创建的闭包,用于包装函数参数的表达式,可以说是一种简便语法. 2:自动闭包不接受任...
    FengxinLi阅读 1,805评论 0 0
  • 本人摘录来自: 王巍 (onevcat). 《Swifter - 100 个 Swift 必备 Tips (第二版...
    方克己阅读 4,231评论 0 0
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 5,326评论 1 5
  • Swifter 100 tips 读后总结 将protocol的方法2为mutating,原因如下:protoco...
    Homer1ynn阅读 2,087评论 0 0
  • 欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中...
    武一顶顶阅读 3,068评论 0 0

友情链接更多精彩内容