A partire da Swift 2.0 sembra che possiamo avvicinarci alle estensioni di tipi generici applicabili a situazioni previste.Swift "where" Array Extensions
Anche se non possiamo ancora farlo:
protocol Idable {
var id : String { get }
}
extension Array where T : Idable {
...
}
... ora possiamo fare questo:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
...
}
}
... e Swift grammaticalmente lo accetta. Tuttavia, per la vita di me non riesco a capire come rendere felice il compilatore quando riempio i contenuti della funzione di esempio. Supponiamo che io dovessi essere il più esplicito possibile:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
return self.filter { (item : T) -> Bool in
return item.id == id
}
}
}
... il compilatore non accetterà la chiusura prevista per filtrare, lamentandosi
non può invocare 'filtro', con una lista di argomenti di tipo ' ((T) -> Bool) '
Simile se l'articolo è specificato come Idable. Qualcuno ha avuto fortuna qui?
Ah che abbia un senso un senso perfetto, grazie per l'apprendimento :) –
@ yo.ian.g: Sei il benvenuto! –
C'è un modo per farlo con i tipi non di protocollo, come 'estensione Array dove Iterator.Element: CGRect'? –