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