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
答案 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 })
我会在下一个测试版中再次检查。