/ / "Контекстуален вид затваряне очаква 2 аргумента" грешка при използване на намаляване в Swift 4 - масиви, бързо, намаляване, swift4, уравнени

"Контекстуален тип затваряне очаква 2 аргумента" грешка при използване на намаляване в Swift 4 - масиви, бързо, намаляване, swift4, уравнени

Следният код се компилира в 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?

Отговори:

8 за отговор № 1

Затварянето премина 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 Разграничение между типовете функция с единични единици и множество аргументи.

Ето още един пример, показващ промяната: Това

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.