首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >抑制Swift中的隐式返回

抑制Swift中的隐式返回
EN

Stack Overflow用户
提问于 2014-06-06 05:33:31
回答 2查看 4.7K关注 0票数 5

考虑以下一组函数:

代码语言:javascript
运行
复制
func testFunc(someFunc: (Int[]) -> ()) {
    someFunc([1, 2, 3])
}

func someFunc<T>(arr : T[]) -> T[] {
    return arr
}

func someOtherFunc<T>(arr : T[]) {
    println(arr)
}

// case 1 - ERROR
testFunc() {
    someFunc($0)
}

// case 2 - no error
testFunc() {
    println("whatever")
    someFunc($0)
}

// case 3 - no error
testFunc() {
    someOtherFunc($0)
}

看起来像在第一种情况下,Swift试图隐式地从闭包返回,因为函数someFunc()返回值。只有当闭包中只有一行(来自单表达式闭包的隐式返回)时,它才会这样做-这就是案例2工作的原因。如果函数是Void,也就是说它不返回值,它就不会这样做。

我的问题是,是否有一种方法可以抑制这种行为,这样我就可以在没有返回值的闭包中使用返回值作为单行表达式的函数。

EN

回答 2

Stack Overflow用户

发布于 2014-09-30 05:30:48

除了提到的解决方案之外:

代码语言:javascript
运行
复制
testFunc { someFunc($0); return () } // returning Void explicitly (with or without parenthesis)

testFunc { someFunc($0); 42 } // or, indeed, just adding a second expression

您也可以消费返回值:

代码语言:javascript
运行
复制
testFunc { let x = someFunc($0) }

或者简单地说:

代码语言:javascript
运行
复制
testFunc { _ = someFunc($0) }

返回值必须始终是函数签名所承诺的类型,隐式返回的情况也是如此。这不是bug。这仅仅是因为隐式返回通常是如此优雅的语法,以至于不匹配类型的不太频繁的情况有点打破了咒语。这并不是说一个好的语法解决方案就不受欢迎,至少在期望Void的时候是这样。也许像这样简单的事情:

代码语言:javascript
运行
复制
testFunc { someFunc($0) ; } // with the trailing semicolon

最让我恼火的是,我自己的函数迫使我绕过它。有几次我显式地忽略了返回类型:

代码语言:javascript
运行
复制
func testFunc<Ignored>(someFunc: [Int] -> Ignored) {
    someFunc([1, 2, 3])
}

testFunc { someFunc($0) }
票数 7
EN

Stack Overflow用户

发布于 2014-08-26 16:02:53

更新:在Swift 1.2之后,这不再是问题

这个错误仍然存在于Xcode beta6中,我希望它会在1.0版本中被修复,在此之前,这是一个变通方法

代码语言:javascript
运行
复制
testFunc() {
    someFunc($0)

    // The explicit return statement corrects the wrong return type of the auto implicit return.
    // It makes more sense than printing nonsense strings
    return //TODO: remove after the bug is fixed
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24070544

复制
相关文章

相似问题

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