🔖

Swift | 宣言時の型に付いている「!」と「?」は何が違うのか?

2022/07/02に公開

! がついた型の意味

var user: User!

! をつけて型を定義した場合、nil が入るかもしれないが、取り出すときは nil ではない想定の変数となる。アンラップが必要ないので記述量が減るが、変数にアクセスしたとき nil だった場合は例外がスローされるので扱いには注意が必要。
(Kotlin で言えば lateinit var name: String とほぼ同じだと理解。)

var user: User! // 初期値は nil となる

// ... いろんな処理

// アンラップせずに使えるが、user が nil だったらエラーになる
let myName = user.name

? がついた型の意味

var user: User?

? をつけて型を定義した場合、常に nil が入っていることを考慮しながら扱う必要がある変数となる。ifguard でアンラップする必要があるので記述量が増えるが、アンラップさえすればエラーになることはない。
(Kotlin で言えば val user: User? = null とほぼ同じだと理解)

// user が nil だったら myName も nil になる
let myName = user?.name
// if を使って name を取り出す場合
if let myName = user?.name {
    // nil ではない myName が扱える
}
// user が nil だった場合はリターンされる
guard let myName = user?.name else { return }

Discussion