给定以下函数声明
func foo(f:()->Foo) -> Bar以下两种使用闭包表达式的代码变体有什么区别:
A)
let result = foo {
return Foo()
}B)
let result = foo {
Foo()
}请注意,未指定常量result的类型,必须推断。
我之所以问这个问题,是因为编译器似乎起了作用--至少目前是这样。这是因为在很多情况下,编译器在使用return Foo()作为闭包表达式时无法推断闭包表达式的类型。另一方面,省略return可能会引起编译器的另一个错误,因为它可能需要return (尽管我不同意编译器,但我确实偏离了.)
这个问题通常可以通过完全指定闭包表达式来解决,例如:
let result = foo { () -> Foo in
return Foo()
}有时,可以通过显式指定result的类型来缓解这种情况。
发布于 2014-10-11 12:16:25
foo函数返回Bar。因此编译器可以很容易地推断出result是Bar。Foo()返回Foo实例。因此,不管您是否指定return,编译器都可以很容易地推断闭包是正确的。下面是我在Xcode 6.0.1操场上玩的代码。
struct Foo {
func foos() {
println("foos")
}
}
struct Bar {
func bars() {
println("bars")
}
}
func foo(f: () -> Foo) -> Bar {
let foof = f()
foof.foos()
return Bar()
}
let result = foo {
return Foo()
}
result.bars()https://stackoverflow.com/questions/26313805
复制相似问题