4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SwiftのOptinal型の意味

Last updated at Posted at 2015-05-01

#Swiftのオプショナル型の基本的な意味

オプションは書いても書かなくてもいい項目

もしユーザの登録画面で書いても書かなくてもいい項目がある場合
「何もない意味する値」=nilが用意されている

エラー例

var age:Int? = 26
print(age + 1)

!マークを付けることでこの中身はnilでないことを保証するのでエラーを出すなと宣言できる

var age:Int? = 26
print(age! + 1)

#オプショナル型のメリット

##ダメな例

var age:Int = nil

変数の型が整数型であるためSwiftは正常だとおもってしまう
しかし実行時にはnilと整数値を計算したらクラッシュする

var age:Int = nil
print(age + 1)

エラーにならずクラッシュする
システムが大規模になるほどageにnilを代入したかどうかが分かりづらくなる
そのためオプショナル型という別の型を用意し、他の人にも自分にもわかりやすく明示する。

##正しい例

var age:Int? = nil
print(age + 1)

ちゃんとしたエラーが出る

#変数buttonがオプショナル型である理由

@IBOutlet weak var button:UIButton

これだとエラーが起きる
なぜか?
安全に書くためにクラスにはすべてのプロパティに値が設定されている状態になってはじめてインスタンスが作成できる。
変数の初期値が未設定のままでは不具合を起こしやすいから。

先に中身の具材を入れるのと一緒で
先にプロパティに値を入れないと、インスタンスは作れない

#Optional Chainingとは

 //Bird構造体
        struct Bird{
            var a:Int
        
            init(n:Int){
                a=n
            }
            
            func toString()->String{
                return "\(a)"
            }
        }
    
        //Birdをwrapする
        var bird1:Bird? = Bird(n:100)

        //もしoptinal型で返さずそのまま代入したら
        var bird2:Bird = Bird(n:111)
        
        
        //?を使うとnilになる可能性のあるオブジェクトのプロパティに安全にアクセスできる。
        //これがOptional Chainingという由縁でa?,b?,c?とoptional型に返せるため
        1番
        print(bird1?.toString())
        
        //bird1はまだoptinal型で返ってきただけなのでアンラップする
        2番
        var kazu:String
        kazu = (bird1?.toString())!
        println(kazu)
        
        //そのまま表示
        3番
        println(bird2.toString())
        
        
        
       1番 Optional("100")
		2番 100	
		3番 111

""つまりOptional型はnilのチェック忘れを防ぐ、それをコンパイラで検出できるようにするためのもの""
もしbird2に数字が入っていなかったら原因不明errorだが、bird1に数字が入っていなかったらnilになるだけであり、後々わかりやすいという事である。

例 通常

var a:Int
print(a)

値を代入しないと、コンパイルエラーになる↓

:4:9: error: variable 'a' used before being initialized
print(a)^:2:5: note: variable defined here var a:Int

例 Optinal型
var a:Int?
print(a)

結果:
nil

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?