#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