キノコが何か作るブログ

ゲーム・ドット絵・アプリなどを作ります

MENU

swiftの「!」「?」とは【備忘録】

変数の後ろに「?」をつけると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だったよ")
}
プライバシーポリシー