Swiftは強力な型推論機構を持っています。これは、プログラマーが明示的に型を指定しなくても、コンパイラが値の型を自動的に特定することを可能にします。型推論はコードを簡潔にし、"ノイズ"を減少させます。例えば:
let number = 42 // Intとして推論される let name = "John" // Stringとして推論される let items = [1, 2, 3] // [Int]として推論される
しかしながら、いくつかのニュアンスには注意が必要です:
let emptyArray = []を宣言した場合、変数はどの型になりますか?
多くの人は emptyArray が “何でも入れられる” 配列または [Any] であると答えます。しかし、実際にはSwiftのコンパイラは型を推論できず、エラーが発生します:
let emptyArray = [] // エラー: 空のコレクションリテラルは明示的な型を必要とします
空の配列を使用するには、型を明示的に指定する必要があります:
let emptyArray: [Int] = []
逸話
チームは let params = [:] として空の辞書を追加し、型が [String: Any] になると期待しましたが、コンパイラは型を推論できず、ビルドが失敗しました。結果として、型推論の特性から原因を特定するのに時間を無駄にしました。
逸話
プロジェクトでは、関数の出力型が let value = decode(json) として定義されていました。開発者は [String: Any] を期待していましたが、曖昧さのためにパーサーは Any を返し、ランタイムでの型変換でアプリケーションがクラッシュしました。
逸話
明示的な指定なしで異なる型の値を配列に追加しようとしました — let items = [1, "two", 3.0]。Swiftは型を [Any] として推論しましたが、これは後続の操作で同じ型の要素の配列が期待されるロジックにエラーを引き起こしました。