50676


画像のようにSwift4を設定しています。  
ネットにはSwift4.2から使えると書いています。

しかし`CaseIterable`を書いてみるとコンパイルが通り正常に動きました。  
なぜでしょうか？

[![画像の説明をここに入力](https://i.stack.imgur.com/e6dF6.png)](https://i.stack.imgur.com/e6dF6.png)

参考：  
\- <https://www.hackingwithswift.com/articles/77/whats-new-in-swift-4-2>  
\- <https://dev.classmethod.jp/smartphone/iphone/wwdc18-swift-4-2-case-
iterable/>


CC BY-SA 4.0
2018-11-27T09:03:40.603
50671
2018-11-27T11:03:16.640
9008
question
swift swift4
CaseIterableはSwift4.2から使えるとネットにあるが、Swift4で動いているように感じる


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モードで動くかと思います。試してみてください。

[code]

    struct MyStruct {
        var i32: Int32
        var i16: Int16
    }
    if let offs = MemoryLayout.offset(of: \MyStruct.i16) {
        print(offs) //-> 4
    }
    
[/code]


CC BY-SA 4.0
2018-11-27T11:03:16.640
50676
2018-11-27T11:03:16.640
13972
50671
answer