考虑以下函数集:
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)
}
在情况 1 中,Swift 试图隐式地从闭包中返回,因为函数 someFunc()
返回一个值。只有在闭包中只有一行时才会这样做(单表达式闭包的隐式返回)——这就是案例 2 起作用的原因。如果函数不执行此操作,例如情况 3 是 Void
,即它不返回值。
我的问题是是否有一种方法可以抑制这种行为,这样我就可以在没有返回值的闭包中拥有一个具有返回值的函数作为单行表达式。
最佳答案
除了提到的解决方案:
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) }
返回值必须始终是函数签名所 promise 的类型,隐式返回的情况也不异常(exception)。这不是错误。只是隐式返回的语法如此优雅,以至于不常见的类型不匹配的情况有点打破了咒语。这并不是说一个不错的句法解决方案不受欢迎,至少在需要 Void
时是这样。也许像这样简单:
testFunc { someFunc($0) ; } // with the trailing semicolon
最让我恼火的是我自己的功能迫使我绕着它跳舞。我有几次显式地忽略了返回类型:
func testFunc<Ignored>(someFunc: [Int] -> Ignored) {
someFunc([1, 2, 3])
}
testFunc { someFunc($0) }
关于swift - 在 Swift 中抑制隐式返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070544/