I generics (tipi generici) permettono di definire funzioni e tipi flessibili e riutilizzabili. La caratteristica chiave di Swift è il mantenimento della type safety: il compilatore verifica il lavoro con specifici tipi durante la compilazione. I tipi generici possono essere limitati attraverso condizioni where, ereditarietà da protocolli e le loro combinazioni.
Esempio di codice:
func swapValues<T>(_ a: inout T, _ b: inout T) { let temp = a a = b b = temp } protocol Drawable { func draw() } func drawAll<T: Drawable>(_ items: [T]) { for item in items { item.draw() } } // Vincolo su protocollo e condizione where func compareValues<T: Equatable>(_ a: T, _ b: T) -> Bool { return a == b }
Possono le funzioni generiche fungere da funzioni sovraccaricate? Come sceglie il compilatore l'implementazione giusta?
Risposta: Sì, le funzioni generiche possono essere sovraccaricate con funzioni normali e altre funzioni generiche. Il compilatore cerca di scegliere l'implementazione più specifica. Esempio:
func printValue(_ value: Int) { print("Int: \(value)") } func printValue<T>(_ value: T) { print("Generico: \(value)") } printValue(5) // Int: 5 printValue("Swift") // Generico: Swift
Storia
Il team ha scritto un'estensione generica per l'array per cercare l'indice, dimenticando di limitare il tipo tramite Equatable. Questo ha portato a un errore di compilazione quando si è cercato di applicare l'estensione su un array con elementi non Equatable.
Storia
Nel progetto si cercava di implementare una cache di oggetti generici senza vincolo di tipo. Di conseguenza, quando si tentava un downcast a runtime si verificavano crash: un uso realmente sicuro avrebbe potuto essere raggiunto tramite protocolli con associated type e vincoli.
Storia
Gli sviluppatori hanno implementato una classe generica, ma durante l'ereditarietà e la sovrascrittura si sono dimenticati di specificare il parametro generico completo dell'erede. Questo ha causato l'impossibilità di compilare il codice e ha richiesto una completa riscrittura della gerarchia dei tipi.