考虑以下一组函数:
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
,也就是说它不返回值,它就不会这样做。
我的问题是,是否有一种方法可以抑制这种行为,这样我就可以在没有返回值的闭包中使用返回值作为单行表达式的函数。
发布于 2014-09-30 05:30:48
除了提到的解决方案之外:
testFunc { someFunc($0); return () } // returning Void explicitly (with or without parenthesis)
testFunc { someFunc($0); 42 } // or, indeed, just adding a second expression
您也可以消费返回值:
testFunc { let x = someFunc($0) }
或者简单地说:
testFunc { _ = someFunc($0) }
返回值必须始终是函数签名所承诺的类型,隐式返回的情况也是如此。这不是bug。这仅仅是因为隐式返回通常是如此优雅的语法,以至于不匹配类型的不太频繁的情况有点打破了咒语。这并不是说一个好的语法解决方案就不受欢迎,至少在期望Void
的时候是这样。也许像这样简单的事情:
testFunc { someFunc($0) ; } // with the trailing semicolon
最让我恼火的是,我自己的函数迫使我绕过它。有几次我显式地忽略了返回类型:
func testFunc<Ignored>(someFunc: [Int] -> Ignored) {
someFunc([1, 2, 3])
}
testFunc { someFunc($0) }
发布于 2014-08-26 16:02:53
更新:在Swift 1.2之后,这不再是问题
这个错误仍然存在于Xcode beta6中,我希望它会在1.0版本中被修复,在此之前,这是一个变通方法
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
}
https://stackoverflow.com/questions/24070544
复制相似问题