Open9

オプショナルについて

インディインディ

最近業務でオプショナルの取り扱いがうまくいっていない理由でクラッシュすることが何度かありました。
僕自身まだまだ知見が浅いので、勉強しながらまとめていきたいと思います。

インディインディ

Swiftにおけるnilの取り扱い

  • Swiftではnilの概念があり、これを厳密に取り扱っている
  • nilに対して適切な処理をしないとエラーが起こり、アプリがクラッシュしてしまう
インディインディ

Optional Type

とはいえ、APIを取得する時とか、頻繁にnilは取り扱っている。
具体的にnilを取り扱う事例はこんなとき。

  • 値が存在しないかもしれないとき
  • Simple domain errorが発生するかもしれないとき
インディインディ

nilが入っているかどうかを安全にチェックする


struct Person{
  var birthday: Date?
}

if person = Person()
if let person: Date = person.birthday { //birthdayに値がある場合
  print(birthday)
} else { //nilの場合
  print("nil")
}
インディインディ

アンラップ

Optinonal型で定義されているものは、通常の文字列としては扱われません。
なので、Optionalを外して正常な値を取り出す必要があります。
これをアンラップという。

インディインディ

アンラップを行う一例

var str: String? = "Hello, world"

if let str = str {
  print(str)
}
インディインディ

強制アンラップ

強制アンラップとは、つまりOptinoalの値を強制的に変換することです。
「!」を用いて、こんな形で書きます。

let value: Int = Int(textfield.text)!

こうすれば、強制的にInteger型にアンラップされます。
これは諸刃の剣みたいなもので、必ず数字に変換できるものが入っていることを確認できていなければ、クラッシュしてしまいます。
その代わり、短く効率的に書くことができるので、慎重に検討して使いましょう。

インディインディ

nilの操作・アクセスを減らすには

  • Optinoalの値は早急に安全に取り出しましょう!
  • 「『!』はnilではない」と確証がある時のみ使いましょう!