Wygląda na to, że od Swift 2.0 możemy zbliżyć się do rozszerzeń typów ogólnych, które mają zastosowanie do predykowanych sytuacji.Swift "gdzie" Rozszerzenia Array
Chociaż nadal nie możemy tego zrobić:
protocol Idable {
var id : String { get }
}
extension Array where T : Idable {
...
}
... teraz możemy to zrobić:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
...
}
}
... i Swift gramatycznie akceptuje. Jednak dla mojego życia nie mogę wymyślić, jak sprawić, aby kompilator był zadowolony, gdy wypełniam zawartość przykładowej funkcji. Załóżmy, że miały być tak wyraźne, jak to możliwe:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
return self.filter { (item : T) -> Bool in
return item.id == id
}
}
}
... kompilator nie zaakceptuje zamknięcia przewidziany do filtrowania, skarżąc
nie może powoływać „filtr” z listy argumentów typu " ((T) -> Bool) '
Podobny element jest określony jako Idable. Czy ktoś tu miał szczęście?
Ah że sens sens, dziękuję za nauki :) –
@ yo.ian.g: Zapraszamy! –
Czy jest sposób na wykonanie tego z typów non-protocol, takich jak 'rozszerzenie Array gdzie Iterator.Element: CGRect'? –