Swift 闭包(Closure)总结

Swift 闭包(Closure)总结

闭包是能够被传递和在代码块中使用的自包含的功能块。Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的Lambda表达式。

闭包能够获取和存储它所处的环境中的变量和常量的引用,相当于给这些变量和常量提供一个封闭的环境。

全局和内置函数,其实就是一些特殊的闭包。闭包有三种形式:
    • 全局函数是有名字而且不会获取值的 闭包。
    • 内置函数是有名字而且能够从封装它的环境中获取值的闭包。
    • 闭包表达式是没有名字具有轻量级语法的闭包,它能从包围它的环境中获取值。

Swift中的闭包表达式具有简洁的风格,包括:
• 从上下文中推断参数和返回值类型。
• 从单一表达式的闭包可以隐式返回。
• 简写参数名字。
• 尾随闭包。

闭包表达式

a. 闭包表达式是一种以简洁集中的语法书写的内联闭包。闭包表达式具有以下一般格式的语法:
{ (parameters) -> return_type in
    statements
}
b. 闭包表达式中的parameters可以是in-out参数,但是不可以有默认值;也可以是可变参数。元组可以作为参数和返回值类型。例如:
    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

    let reverseNames = names.sort({
        (s1: String, s2: String) -> Bool in
        return s1 > s2
    })

    print(reverseNames)
c. 从上下文推断类型
因为上面的那个排序闭包是作为参数传递给一个方法,Swift能够推断出闭包的参数类型和返回值类型,其类型为(String, String) -> Bool,所以这些参数都可以不用在闭包中出现,可以简写为:
    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

    let reverseNames = names.sort({s1, s2 in return s1 > s2})

所以当闭包作为函数或者方法的参数的时候,可以省略其参数类型。
d. 单一表达式闭包隐式返回
如上的闭包中闭包体只有一条语句:return s1 > s2。当只有一条返回语句时,可以将return省略,简写为:
let reverseNames = names.sort({s1, s2 in s1 > s2})
e. 简写参数名字
Swift自动为内联闭包提供简写参数名字:$0, $1, $2,...分别代表第一个参数,第二个参数,第三个参数等等。所以上面的代码可以简写为:
let reverseNames = names.sort({$0 > $1})
因为没有了显式参数,所以就把in关键字省略了。

尾随闭包

如果闭包表达式是函数的最后一个参数而且闭包表达式比较长的时候,可以采用尾随闭包。尾随闭包是将闭包表达式写在括号之后。例如以下的代码:
func someFunctionThatTakesAClosure(closure: () -> Void) {
        // function body goes here
    }

    // here's how you call this function without using a trailing closure:

    someFunctionThatTakesAClosure({
        // closure's body goes here
    })

    // here's how you call this function with a trailing closure instead:

    someFunctionThatTakesAClosure() {
        // trailing closure's body goes here
    }
上面的排序闭包也可以写为:
let reverseNames = names.sort(){$0 > $1}
如果将闭包表达式作为参数的那个函数仅有一个参数的话,可以连括号都省略了:
let reverseNames = names.sort{$0 > $1}

参考资料:
https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值