変数の後ろに「?」をつけるとOptional型になります。
var str1: String = "Hello, playground" var str2: String? = "Hello, playground" print("str1: \(str1)") //str1: Hello, playground print("str2: \(str2)") //str2: Optional("Hello, playground")
Optional型ってよくわからなかったんですよね。
なぜか「!」付けないと使えないし「!」付けたらたまにクラッシュするし。なんだこれ?って感じでした。
Optionalはなぜあるか
swiftではnil(null)を変数に入れることができません。思わぬところでnilが入ることを防ぐためです。
しかしnilを使いたい場面が出てきます。そこでOptionalです。
変数にOptionalをつけるとnilを入れられるようになります。
var str1: String //errorになる。 var str2: String? //nilがはいる。errorにならない。
なぜOptional型はそのままだと使えないのか
単純に予期せぬnilが入っているかもしれないからです。
Optional型はnilを許容する型なので、もしかしたらnilが入っていてその後の処理に影響するかもしれません。
nilが入る変数を自分で指定すれば、バグで変数にnilが入ってクラッシュするということを減らせます。
Optionalの変数を使うには
使いたいOptional変数の後ろに「!」をつけると使えるようになります。
var num: Int? = 10 print(num - 5) //errorになる print(num! - 5) //errorがでない
Optionalがついた状態のことを「ラップされている」と言ったります。
この「ラップ」を剥がしてくれるのが「!」なのです。
「!」を使ってラップを剥がすことを「アンラップ」といいます。
アンラップすることでOptionalが外れて普通に使えるようになります。
nilが入っている変数をアンラップしないために
予想外のバグでnilが入っているときにアンラップしてしまうことがあると思います。
その時はif let文を使うと便利です。
if let文は変数をアンラップして別の変数に入れた後に、その変数がnilじゃないかをチェックしてくれます。
let num1: Int? = nil if let num2 = num1 { print("nilじゃないかったよ:\(num2)") }else{ print("nilだったよ") }