ProgrammazioneSenior iOS Developer

Descrivi il meccanismo dei generics in Swift. Come garantire la type safety quando si lavora con tipi generici? Fornisci esempi di vincoli sui tipi generici.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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 }

Domanda trabocchetto.

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

Esempi di errori reali dovuti alla mancanza di conoscenza delle sottigliezze dell'argomento.


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.