質問: 画像のようにSwift4を設定しています。 ネットにはSwift4.2から使えると書いています。 しかし`CaseIterable`を書いてみるとコンパイルが通り正常に動きました。 なぜでしょうか? ![画像の説明をここに入力](https://i.stack.imgur.com/e6dF6.png) 参考: - -
回答: Swift 4どころか、Swift 3を指定しても、`CaseIterable`が使えませんか? Xcode 10.xに付属するSwiftコンパイラは、Swift 4.2.xであり、リンクされるSwift標準ライブラリもSwift 4.2用のものです。 Build Settingsにある、Swift Language Versionは、あくまでもSwift 4.2コンパイラをどのモードで走らせるかという指定であり、動作がSwift 3コンパイラやSwift 4コンパイラと全く同じになるわけではありません。Swift 4.2で導入された機能のうち、Swift 3モードやSwift 4モードの動作と矛盾しないものは、それらのモードを指定しても使えたりします。 また構文は全く変わらないままSwift標準ライブラリの挙動が変更になっている場合などは、Swift 3/4を指定していても、Swift 4.2標準ライブラリの挙動となります。 `CaseIterable`の他にもSwift 4.2で導入された機能(下の例は`offset(of:)`)がSwift 3/4モードで動くかと思います。試してみてください。 ``` struct MyStruct { var i32: Int32 var i16: Int16 } if let offs = MemoryLayout.offset(of: \MyStruct.i16) { print(offs) //-> 4 } ```