Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
?? (Nil合体演算子)
Swiftの『??』(Nil合体演算子)は、Optionalの値がnilの場合にデフォルト値を返す演算子です。簡潔にOptionalのデフォルト値を設定できます。
構文
// 基本形(aがnilならbを返す) a ?? b // チェーン(a→b→cの順で最初の非nil値を返す) a ?? b ?? c // 代入への利用 変数 = Optional値 ?? デフォルト値
構文一覧
| 構文 | 概要 |
|---|---|
| a ?? b | aがnilでなければaの値を、nilならbを返します。 |
| a ?? b ?? c | 左から順に非nilの値を返します(チェーン)。 |
| 変数 = opt ?? デフォルト | Optionalをアンラップし、nilならデフォルト値を代入します。 |
| opt ?? { 処理 }() | 右辺にクロージャを使って複雑なデフォルト値を計算します。 |
サンプルコード
// 基本的な使い方
let username: String? = nil
let displayName = username ?? "ゲスト"
print(displayName) // ゲスト
// 値がある場合
let loggedInUser: String? = "太郎"
let name = loggedInUser ?? "ゲスト"
print(name) // 太郎
// チェーン
let primary: String? = nil
let secondary: String? = nil
let fallback = "デフォルト"
let result = primary ?? secondary ?? fallback
print(result) // デフォルト
// 数値のデフォルト値
let input = "abc"
let number = Int(input) ?? 0 // 変換失敗時は0
print(number) // 0
let validInput = "42"
let validNumber = Int(validInput) ?? 0
print(validNumber) // 42
// 辞書のデフォルト値
let config: [String: Int] = ["timeout": 30]
let timeout = config["timeout"] ?? 60
let retries = config["retries"] ?? 3
print("タイムアウト: \(timeout)秒, リトライ: \(retries)回")
// 代入に使う
var settings: String? = nil
settings = settings ?? "デフォルト設定"
print(settings!) // デフォルト設定
概要
『??』演算子は三項演算子の短縮形です。内部的には『a != nil ? a! : b』と同等ですが、より読みやすく書けます。右辺は左辺がnilの場合のみ評価されます(短絡評価)。
左辺と右辺の型は一致している必要があります。右辺の型が左辺のOptionalの内包型と異なる場合はコンパイルエラーになります。また、右辺にOptionalを指定すると結果もOptionalになる場合があるため注意してください。
Optional Chainingのメソッド呼び出しについてはOptional Chaining / map / flatMap(Optional)を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。