Ios 闭包表达式{exp}vs{return exp}
给定以下函数声明Ios 闭包表达式{exp}vs{return exp},ios,macos,swift,closures,Ios,Macos,Swift,Closures,给定以下函数声明 func foo(f:()->Foo) -> Bar 以下两种使用闭包表达式的代码变体有什么区别: A B 请注意,常量结果的类型没有指定,必须进行推断 我问这个问题的原因是编译器似乎起到了作用——至少目前是这样。这是因为在很多情况下,当使用returnfoo作为闭包表达式时,编译器无法推断闭包表达式的类型。另一方面,省略返回可能会导致编译器出现另一个错误,因为即使我不同意编译器的意见,它也可能需要返回,但我确实离题了 这个问题通常可以通过完全指定闭包表达式来解决
func foo(f:()->Foo) -> Bar
以下两种使用闭包表达式的代码变体有什么区别:
A
B
请注意,常量结果的类型没有指定,必须进行推断
我问这个问题的原因是编译器似乎起到了作用——至少目前是这样。这是因为在很多情况下,当使用returnfoo作为闭包表达式时,编译器无法推断闭包表达式的类型。另一方面,省略返回可能会导致编译器出现另一个错误,因为即使我不同意编译器的意见,它也可能需要返回,但我确实离题了
这个问题通常可以通过完全指定闭包表达式来解决,例如:
let result = foo { () -> Foo in
return Foo()
}
或者,有时可以通过显式指定结果的类型来缓解这种情况。foo函数返回Bar。所以编译器可以很容易地推断出结果是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()
相关:dasblinkenlight:我觉得这像是一个编译器错误。我同意,这可能是一个显而易见的原因。几天前我已经提交了一份相关的bug报告了?以前
let result = foo { () -> Foo in
return Foo()
}
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()