Zacznijmy od definicji flatMap
do słownika, który jest następujący:
func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
Widać, że zamknięcie transform
trwa tylko jeden parametr typu Element
gdzie Element
to tylko typealias
dla krotki:
public typealias Element = (key: Key, value: Value)
Więc pierwsze i tylko argument zamknięcia powinny być krotką z dwóch elementów (key
typu Key
i value
typu Value
).
Teraz, jeśli spojrzeć na kod (który kompiluje w Swift 3), widać, że nie jest to przypadek, i powinno być pytanie dlaczego to nawet pracować w Swift 3.
try flatMap({ (key, value) in
return try transform(key, value)
})
Twój zamknięcie trwa 2 argumenty zamiast jednego (key
typu Key
i value
typu Value
). Działa to w Swift 3 dzięki funkcji o nazwie destructuring, w której kompilator automatycznie przekształci krotkę 2 elementów w 2 argumenty.
Ale ta funkcja jest dziwne, rzadko używany i daje nieoczekiwane rezultaty większość czasu, więc została ona usunięta w Swift 4.
Edit: Jak podkreślił OOPer, funkcja ta została tymczasowo usunięta w Swift 4 beta, ale powinien zostać ponownie dodany przed ostateczną wersją.
Zamiast tego należy pisać:
try flatMap({ tupleArgument in
return try transform(tupleArgument.key, tupleArgument.value)
})
i Twojego funkcji flatMap
staje:
func flatMap<KeyPrime, ValuePrime>(_ transform: (Key, Value) throws -> (KeyPrime, ValuePrime)?) rethrows -> [KeyPrime:ValuePrime] {
return Dictionary<KeyPrime, ValuePrime>(elements: try flatMap({ element in
return try transform(element.key, element.value)
}))
}
'Dictionary.init (elementy):' nie można znaleźć w standardzie SWIFT Library. Sam definiujesz? – OOPer
Tak, aktualizuję odpowiedź –
Mam zaktualizowaną odpowiedź –