11

以下代码在 Swift 3 中编译

extension Array where Element: Equatable {
    var removeDuplicate: [Element] {
        return reduce([]){ $0.0.contains($0.1) ? $0.0 : $0.0 + [$0.1] }
    }
}

但产生错误

错误:上下文闭包类型 '(_, _) -> _' 需要 2 个参数,但在闭包主体中使用了 1

在 Swift 4 中。如何将此代码转换为在 Swift 4 中编译?

4

1 回答 1

15

传递给的闭包reduce接受 2 个参数,例如$0$1在简写符号中:

extension Array where Element: Equatable {
    var removeDuplicate: [Element] {
        return reduce([]) { $0.contains($1) ? $0 : $0 + [$1] }
    }
}

(这在 Swift 3 和 4 中都可以编译。)

在 Swift 3 中,您可以使用单个参数$0,这将被推断为带有元素的元组$0.0$0.1。这在 Swift 4 中不再可能,因为SE-0110 Distinguish between single-tuple and multiple-argument function types

这是另一个演示更改的示例:

let clo1: (Int, Int) -> Int = { (x, y) in x + y }
let clo2: ((Int, Int)) -> Int = { z in z.0 + z.1 }

两者都在 Swift 3 和 4 中编译,但这

let clo3: (Int, Int) -> Int = { z in z.0 + z.1 }

仅在 Swift 3 中编译,而不在 Swift 4 中编译。

于 2017-09-26T17:30:13.367 回答