美文网首页
@autoclosure 和 ??

@autoclosure 和 ??

作者: fordring2008 | 来源:发表于2017-02-03 23:16 被阅读21次

    自动关闭关键字

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

    相关文章

      网友评论

          本文标题:@autoclosure 和 ??

          本文链接:https://www.haomeiwen.com/subject/zkcjittx.html