首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包表达式{exp} vs {返回exp}

闭包表达式{exp} vs {返回exp}
EN

Stack Overflow用户
提问于 2014-10-11 10:48:33
回答 1查看 37关注 0票数 0

给定以下函数声明

代码语言:javascript
复制
func foo(f:()->Foo) -> Bar

以下两种使用闭包表达式的代码变体有什么区别:

A)

代码语言:javascript
复制
let result = foo { 
    return Foo()
}

B)

代码语言:javascript
复制
let result = foo { 
    Foo()
}

请注意,未指定常量result的类型,必须推断。

我之所以问这个问题,是因为编译器似乎起了作用--至少目前是这样。这是因为在很多情况下,编译器在使用return Foo()作为闭包表达式时无法推断闭包表达式的类型。另一方面,省略return可能会引起编译器的另一个错误,因为它可能需要return (尽管我不同意编译器,但我确实偏离了.)

这个问题通常可以通过完全指定闭包表达式来解决,例如:

代码语言:javascript
复制
let result = foo { () -> Foo in
    return Foo()
}

有时,可以通过显式指定result的类型来缓解这种情况。

EN

回答 1

Stack Overflow用户

发布于 2014-10-11 12:16:25

foo函数返回Bar。因此编译器可以很容易地推断出resultBarFoo()返回Foo实例。因此,不管您是否指定return,编译器都可以很容易地推断闭包是正确的。下面是我在Xcode 6.0.1操场上玩的代码。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26313805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档