【问题标题】:Understanding shorthand closure syntax for map function in Swift理解 Swift 中 map 函数的简写闭包语法
【发布时间】:2016-09-26 09:39:58
【问题描述】:

我正在尝试理解 map 函数使用的一些简写语法。

以下是设置

    let array = [1, 2, 3]

    // these make sense
    let arr1 = array.map({String($0)})
    let arr2 = array.map{String($0)}
    let arr3 = array.map({ number in
        return String(number)
    })
    let arr4 = array.map({ (number) -> String in
        String(number)
    })

这就是混乱所在。在swift中,我可以放弃map的花括号,但这似乎是无法完成的事情,因为我自己的函数有一个尾随闭包。也许正在做出一些神奇的推论?还有为什么String是这样初始化的?

    // this doesn't make sense. Foregoing the curly braces? I can't do that!!!
    let arr5 = array.map(String.init)    
    let arr6 = array.map(String())    // Compile Error: Cannot convert value of type 'String' to expected argument type '@noescape (Int) throws -> _'

这是我尝试使用与 map 类似的语法

func crap(block:(Int)-> String) {
    print("Int to string block" + block(1));
}
// works obviously
crap{ "\($0) some garbage" }
// compile error : Anonymous closure argument not contained in a closure
crap( "\($0) some garbage" )

【问题讨论】:

    标签: swift functional-programming closures


    【解决方案1】:

    区分括号 () 和花括号 {}

    在某种意义上,只有括号版本是“真实的”,因为毕竟这是函数调用所需要的。当您调用map 时,在括号中放置了一个函数。它可能是一个函数reference(即函数的名称):

        let arr = [1,2,3]
        func double(i:Int) -> Int {return i*2}
        let arr2 = arr.map(double)
    

    也可以是匿名函数,即花括号中的函数体:

        let arr = [1,2,3]
        let arr2 = arr.map({$0*2})
    

    但在那种的情况下,并且仅在那种情况下,你可以(作为一种快捷方式)使用“尾随闭包”语法来代替:

        let arr = [1,2,3]
        let arr2 = arr.map(){$0*2}
    

    但由于map 不接受其他参数,因此您可以省略括号——这是 Swift 中唯一可以调用不带括号的函数的情况:

        let arr = [1,2,3]
        let arr2 = arr.map{$0*2}
    

    【讨论】:

    • 哦,我是个假人。我走上了一条错误的道路,以为我可以将一个块拖到函数调用中。好的,谢谢。
    • 有没有办法从键盘快速触发这种速记语法?
    猜你喜欢
    • 2017-03-17
    • 2019-08-14
    • 2016-02-01
    • 2019-02-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多