Swift possède un puissant mécanisme d'inférence de type — il permet au compilateur de déterminer automatiquement le type d'une valeur sans indication explicite du type par le programmeur. L'inférence de type simplifie le code et réduit son "bruit". Par exemple :
let number = 42 // inféré comme Int let name = "John" // inféré comme String let items = [1, 2, 3] // inféré comme [Int]
Cependant, il convient de garder à l'esprit certains détails :
Quel type obtiendra la variable si nous déclarons
let emptyArray = []?
On répond souvent que emptyArray sera un tableau "de quoi que ce soit" ou [Any]. En réalité, le compilateur Swift ne pourra pas déduire le type et produira une erreur :
let emptyArray = [] // Erreur : le littéral de collection vide nécessite un type explicite
Pour utiliser un tableau vide, il est nécessaire d'indiquer explicitement le type :
let emptyArray: [Int] = []
Histoire
L'équipe a ajouté un dictionnaire vide comme let params = [:] et s'attendait à ce que le type soit [String: Any], cependant, le compilateur n'a pas pu inférer le type, ce qui a entraîné un échec de la compilation. Conclusion — le temps passé à comprendre la cause provient des spécificités de l'inférence de type.
Histoire
Dans le projet, un type de sortie de fonction a été défini comme let value = decode(json). Le développeur s'attendait à [String: Any], mais en raison de l'ambiguïté, le parser retournait Any, ce qui a provoqué la panne de l'application lors du cast de type à l'exécution.
Histoire
Ils ont essayé d'ajouter des valeurs de différents types dans un tableau sans indication explicite — let items = [1, "deux", 3.0]. Swift a déduit le type comme [Any], mais cela a conduit à des erreurs de logique, où un tableau d'éléments d'un même type était attendu pour des opérations ultérieures.