当参数隐式时,为什么Swift闭包语法不接受使用return?

时间:2014-08-30 16:36:13

标签: swift

Swift的语言设计背后的原因是什么使得以下可接受的

[1, 2, 3, 4].map({ (number:Int)->Int in return number * 3 })  // ok

[1, 2, 3, 4].map({ number in number * 3 })  // ok

[1, 2, 3, 4].map({ 3 * $0 })  // ok

虽然这是不可接受的?

[1, 2, 3, 4].map({ return 3 * $0 })  // not ok

3 个答案:

答案 0 :(得分:3)

这显然是编译器错误,因为将闭包移动到它起作用的单独变量:

let closure1: (Int) -> (Int) = { return 3 * $0 }
var closure2: (Int) -> (Int) = { return 3 * $0 }
[1, 2, 3, 4].map( closure1 ) // Works
[1, 2, 3, 4].map( closure2 ) // Works
[1, 2, 3, 4].map( { return 3 * $0 } ) // Fails

答案 1 :(得分:2)

这似乎是类型推理引擎中的一个错误。例如:

[1, 2, 3].map({ return 3 * $0 } as Int -> Int)

很好。

编辑:感谢@Antonio的评论删除了一些废话。

答案 2 :(得分:2)

我怀疑这是一个beta6编译器错误。请注意,以下操作(添加显式类型):

let z:[Int] = [1, 2, 3, 4].map({ return 3 * $0 })

我会在下一个测试版中再次检查。