Swift ha un potente meccanismo di inference dei tipi: permette al compilatore di determinare automaticamente il tipo di un valore senza che il programmatore debba specificare esplicitamente il tipo. L'inference dei tipi semplifica il codice e riduce il suo "rumore". Ad esempio:
let number = 42 // inferred as Int let name = "John" // inferred as String let items = [1, 2, 3] // inferred as [Int]
Tuttavia, è importante ricordare alcuni aspetti:
Quale tipo otterrà la variabile se dichiariamo
let emptyArray = []?
Spesso si risponde che emptyArray sarà un array di "qualsiasi cosa" o [Any]. In realtà, il compilatore Swift non sarà in grado di inferire il tipo e genererà un errore:
let emptyArray = [] // Error: empty collection literal requires an explicit type
Per utilizzare un array vuoto, è necessario specificare esplicitamente il tipo:
let emptyArray: [Int] = []
Storia
Il team ha aggiunto un dizionario vuoto come let params = [:] e si aspettava che il tipo fosse [String: Any], ma il compilatore non è riuscito a inferire il tipo, causando un fallimento nella compilazione. Risultato: tempo speso a capire la causa che si presentava a causa delle peculiarità dell'inference dei tipi.
Storia
Nel progetto è stato utilizzato un tipo di uscita di funzione, definito come let value = decode(json). Lo sviluppatore contava su [String: Any], ma a causa dell'ambiguità, il parser restituiva Any, il che ha portato a un crash dell'applicazione durante il cast del tipo a runtime.
Storia
Hanno cercato di aggiungere valori di tipi diversi a un array senza specificare esplicitamente — let items = [1, "two", 3.0]. Swift ha inferito il tipo come [Any], ma questo ha portato a errori di logica, dove ci si aspettava un array di elementi dello stesso tipo per operazioni successive.