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()