Swift posiada potężny mechanizm wnioskowania typów — pozwala kompilatorowi automatycznie określać typ wartości bez wyraźnego wskazywania typu przez programistę. Wnioskowanie typów ułatwia kod i zmniejsza jego "szum". Na przykład:
let number = 42 // inferowane jako Int let name = "John" // inferowane jako String let items = [1, 2, 3] // inferowane jako [Int]
Jednak warto pamiętać o pewnych niuansach:
Jaki typ otrzyma zmienna, jeśli zadeklarujemy
let emptyArray = []?
Często odpowiadają, że emptyArray będzie tablicą "czegokolwiek" lub [Any]. W rzeczywistości kompilator Swift nie będzie w stanie wnioskować typu i zgłosi błąd:
let emptyArray = [] // Błąd: pusty literał kolekcji wymaga jawnie określonego typu
Aby używać pustej tablicy, należy jawnie określić typ:
let emptyArray: [Int] = []
Historia
Zespół dodał pusty słownik jako let params = [:] i oczekiwał, że typ będzie [String: Any], jednak kompilator nie był w stanie wnioskować typu, co spowodowało awarię kompilacji. Podsumowując — zmarnowany czas na ustalanie przyczyny wynika z cech wnioskowania typów.
Historia
W projekcie używano typu wyjściowego funkcji, który został zdefiniowany jako let value = decode(json). Programista oczekiwał [String: Any], ale z powodu niejednoznaczności parser zwracał Any, co spowodowało awarię aplikacji podczas rzutowania typu w czasie wykonywania.
Historia
Próbowano dodać wartości różnych typów do tablicy bez jawnego wskazania — let items = [1, "two", 3.0]. Swift wywnioskował typ jako [Any], co jednak doprowadziło do błędów w logice, gdzie oczekiwano tablicy elementów jednego typu do późniejszych operacji.