Swift の Optional のメモ

Swift の Optional についてのメモ。 型の後ろにつく「?」や「!」がわからなかったので調べつつ動作確認をしたのでメモ。

[Swift] Optional型についてのまとめ

http://qiita.com/edo_m18/items/ca8c9c21049c280d3328

[Swift] 「!」、「?」マーク(Optional)についてのメモ

http://qiita.com/cotrpepe/items/e30c7442733b93adf46a

のあたりを読みつつ動作確認。以下はその結果。

        // var prop: Optinal<String> と同義. optional でラップされる
        // ? はnilの可能性を含む.
        var prop: String?
        
        // var prop2: ImplicitlyUnwrappedOptional<String> と同義
        // ! は ? でラップされた状態をアンラップする
        var prop2: String!
        
        
        // 確認1: ?, ! を利用した場合の 初期値 nilセット
        var hoge:String? = nil // OK nil は OK
        var hoge1:String! = nil // OK これはなぜ?初期値に nil がセットできるのは問題では?
        //var hoge2:String = nil // NG nil は NG
        var hoge2:String = "hoge" // OK nil 以外なら OK
        
        // 確認2 ?, ! で宣言した変数に対するメソッド実行(と、実行時に ?,! を指定した場合)
        
        // ?の場合
        // エラー。Optinal<String>の記法の通り wrap されているので、直接 String のメソッドは利用できない。静的解析のタイミングでエラー
        var value1 = hoge.toInt()
        
        // OK。 hogeがnilかチェックをしてくれる。hogeがnilの場合は toInt は実行しないので実行時エラーにはならない。 nil 出ない場合に実行される
        var value2 = hoge?.toInt()
        
        // 実行時エラー。 ! で String としてアンラップしており、コンパイルは通るが、実際には nil なので実行時エラーになる
        var value3 = hoge!.toInt()
        
        
        // !の場合
        // 実行時エラー。 コンパイルは通るが、実際には nil なので実行時エラーになる
        var value4 = hoge1.toInt()
        
        // OK。 hogeがnilかチェックをしてくれる。hogeがnilの場合は toInt は実行しないので実行時エラーにはならない。 nil 出ない場合に実行される
        var value5 = hoge1?.toInt()
        
        // 実行時エラー。 ! で String としてアンラップしており、コンパイルは通るが、実際には nil なので実行時エラーになる
        var value6 = hoge1!.toInt()

        
        // ?も!もなし
        // OK。
        var value7 = hoge2.toInt()
        
        // エラー。 hoge1 は optionalType ではないので ? は使えない. 静的解析のタイミングでエラー
        var value8 = hoge2?.toInt()
        
        // エラー。 hoge1 は optionalType ではないので ? は使えない. 静的解析のタイミングでエラー
        var value9 = hoge2!.toInt()