swift - 在 Swift 中抑制隐式返回

标签 swift

考虑以下函数集:

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/

相关文章:

ios - Swift - 如何使用 XIB 文件创建自定义 viewForHeaderInSection?

ios - ScrollView 不随 subview 滚动

ios - UIViewController initWithNibNamed :bundle: initialized two objects?

ios - 如何使用显示 View Controller ?

swift - 泛型类型错误 : Cannot explicitly specialise a generic type

ios - 从 Swift 中的 UITableViewController 转出后,我的 ViewController 中缺少后退按钮

ios - SpriteKit 滚动背景图像显示图像之间的线条

swift - 激活开关时用文本填充文本字段

ios - AnyObject 不可转换为 'String'

ios - 从 UIActivityViewController 中的 API 获取的自定义消息