Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Optional / ? / !
Swiftの『Optional』は「値があるかもしれないし、nilかもしれない」型です。変数名の後に『?』を付けて宣言し、nil安全なプログラミングを実現します。
構文
// Optional型の宣言 var 変数名: 型? = 値 var 変数名: 型? = nil // 強制アンラップ(値があることが確実な場合のみ) 変数名! // Optional.noneとOptional.some Optional<型>.none // nil と同じ Optional<型>.some(値) // 値を包んだOptional
構文一覧
| 構文 | 概要 |
|---|---|
| 型? | Optional型を宣言します。値またはnilを保持できます。 |
| nil | 値がないことを表す特殊な値です。 |
| 変数! | 強制アンラップします。nilの場合はクラッシュします。 |
| 変数 == nil | 値がnilかどうかを確認します。 |
| 変数 != nil | 値が存在するかどうかを確認します。 |
| Optional.some(値) | 値をOptionalに包みます(明示的な書き方)。 |
| Optional.none | nilと同等のOptionalの表現です。 |
サンプルコード
// Optional型の宣言
var name: String? = "太郎"
var age: Int? = nil
print(name) // Optional("太郎")
print(age) // nil
// nilチェック
if name != nil {
print("名前あり: \(name!)") // 強制アンラップ(nilでないことを確認済み)
}
// Optionalの更新
name = nil // nilを代入できる
age = 25 // 値を代入できる
print(name) // nil
print(age) // Optional(25)
// Optional.someとOptional.noneの明示的な使用
let value: Optional<Int> = Optional.some(42)
let empty: Optional<Int> = Optional.none
print(value) // Optional(42)
print(empty) // nil
// 文字列のOptionalからIntへの変換(標準ライブラリの例)
let str = "123"
let parsed = Int(str) // 戻り値はInt?(変換失敗するとnil)
print(parsed) // Optional(123)
let invalid = "abc"
let failed = Int(invalid)
print(failed) // nil
概要
『Optional』はSwiftの型システムの中核です。他の言語でnullポインタ参照エラーが起きる場面でも、Swiftではコンパイラが安全なアンラップを強制することでクラッシュを防ぎます。
強制アンラップ(『!』)はnilの場合にクラッシュするため、使用には注意が必要です。nilを強制アンラップするとランタイムエラー(EXC_BAD_INSTRUCTION)が発生します。安全なアンラップには『if let』や『guard let』、『??』演算子を使いましょう。
Optionalの安全なアンラップについてはif let / guard let(Optional Binding)を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。