给出以下函数声明
func foo(f:()->Foo) -> Bar
使用Closure表达式的以下两种代码变体有什么不同:
A)
let result = foo {
return Foo()
}
B)
let result = foo {
Foo()
}
请注意,常量result
的类型未指定,必须推断。
我之所以要问的是编译器似乎有所作为 - 至少目前是这样。这是因为在很多情况下,当使用return Foo()
作为闭包表达式时,编译器无法推断闭包表达式的类型。另一方面省略return
可能会由编译器发出另一个错误,因为它可能需要return
(即使我不同意编译器,但我确实离题了......)
这个问题通常可以通过完全指定闭包表达式来解决,例如:
let result = foo { () -> Foo in
return Foo()
}
或有时可以通过明确指定result
的类型来缓解。
答案 0 :(得分:0)
foo
函数返回Bar
。因此,编译器可以轻松推断result
是Bar
。 Foo()
返回Foo
个实例。因此,无论您是否指定return
,编译器都可以轻松推断闭包是否正确。这是我在Xcode 6.0.1 playground中使用的代码。
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()