2015-11-24 | 阅读(324)
咋一眼看到 Swift @autoclosure 自动闭包便不由自主的联想到 Scala 的 Call-By-Name 求值策略。既然主要话题是关于 Swift 的,那还是 Swift 的 @autoclosure 先入为主,下面例子中的 greet(name: () -> String)
接收一个闭包作为参数
|
func greet(name: () -> String) { print("Hello \(name())") } greet({() in return "Swift"}) //标准 greet({return "Swift"}) //简化 greet({"Swift"}) //再简化 greet{"Swift"} //因为 greet 只有一个参数,因而可以这样写 |
对 greet(_:)
的函数调用不断简化,最后简化为 greet{"Swift}
。总而言之大括号是甩不了了,有大括号的围绕才叫闭包。
同时我们依据闭包的简化规则倒退发现:给任何一个表达式两边加上大括号 {},就构成了一个闭包,它是无参数的闭包,返回值可有可无。例如 {1+2}, {foo(10)+5}, {print("Hello")}, {array.removeAtIndex(0)} 等等
至此,我们还未死心,思考能不能对 greet{"Swift"} 的写法进一步简化,这就要请出 @autoclosure 隆重登场, 对 greet() 的 name 参数前加上 @autoclosure, 就是 阅读全文 >>