Optional は、値を保持しているか、あるいは nil(値がない状態)を保持するかのどちらかの型です。Swiftは型システムの中で nil を明示的に扱います。String は決して nil になりませんが、 は になり得ます。これがSwiftがほとんどのnullポインタクラッシュをコンパイル時に排除する仕組みです。
Optional は、値を保持しているか、あるいは nil(値がない状態)を保持するかのどちらかの型です。Swiftは型システムの中で nil を明示的に扱います。String は決して nil になりませんが、 は になり得ます。これがSwiftがほとんどのnullポインタクラッシュをコンパイル時に排除する仕組みです。
String?nil内部的には Int? は2つのケースを持つenumです。.some(value) または .none です。ラップされた値を直接使うことはできず、まずアンラップする必要があります。
var name: String? = "Ada" // Optional String, currently .some("Ada")
var missing: String? = nil // .none
// if let: bind only when non-nil, scoped to the block
if let name = name {
print(name.count) // safe: name is a plain String here
}
// guard let: unwrap or exit early — keeps the happy path un-nested
func greet(_ input: String?) {
guard let input else { return } // Swift 5.7 shorthand
print("Hi \(input)") // input is non-optional below
}
// nil-coalescing: supply a default
let display = name ?? "Anonymous"
! 演算子は強制アンラップを行います。name! は name が nil の場合にクラッシュします。値がプログラムのロジックによって保証されている場合にのみ使い、それ以外は if let、guard let、?? を優先してください。
let url = URL(string: "https://a.com")! // OK: literal is always valid
let user = fetchUser()! // BAD: crashes on nil
String!)は、nil のときにアクセスすると静かにクラッシュします。@IBOutlet でよく見られます。user?.address?.city はクラッシュする代わりに nil へと短絡評価されます。Optionalは「これは存在しないかもしれない」ということを型にエンコードするため、コンパイラが空のケースを扱うことを強制します。面接官はこれを使って、あなたが ! を散りばめる代わりに guard let や ?? に手を伸ばすかどうかを見ます。それがクラッシュしやすいアプリと安全なアプリの違いです。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する