“contextual closure type expects 2 arguments” error when using reduce in Swift 4

前端 未结 1 580
迷失自我
迷失自我 2020-12-30 09:13

The following code compiles in Swift 3

extension Array where Element: Equatable {
    var removeDuplicate: [Element] {
        return reduce([]){ $0.0.contai         


        
相关标签:
1条回答
  • 2020-12-30 09:38

    The closure passed to reduce takes 2 parameters, e.g. $0 and $1 in the shorthand notation:

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

    (This compiles in both Swift 3 and 4.)

    In Swift 3 you could use single parameter $0, which would the be inferred as a tuple with elements $0.0 and $0.1. This is not possible anymore in Swift 4, as a consequence of SE-0110 Distinguish between single-tuple and multiple-argument function types.

    Here is another example demonstrating the change: This

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

    both compiles in Swift 3 and 4, but this

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

    compiles only in Swift 3, not in Swift 4.

    0 讨论(0)
提交回复
热议问题