🔖
Swift | 宣言時の型に付いている「!」と「?」は何が違うのか?
!
がついた型の意味
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 が入っていることを考慮しながら扱う必要がある変数となる。if
や guard
でアンラップする必要があるので記述量が増えるが、アンラップさえすればエラーになることはない。
(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