SwiftのNil結合演算子(Nil-Coalescing Operator)


この記事は何?

Swiftの??演算子について、調べました。

環境

Swift5.1
Xcode11 beta5
macOS Mojave

Nil-Coalescing Operatorの動作

nil-coalescing 演算子(??)は、次のように記述します。

nil-coalescingの基本
optionalValue ?? defaultValue

このコードは...

  • optionalValueに値がある場合、アンラップする
  • optionalValuenilの場合、デフォルト値defaultValueを返す

optionalValueは常にオプショナル型です。
defaultValueは、optionalValueの型と一致する必要があります。
nil-coalescing 演算子は、次のコードの省略形です。

三項演算子
optionalValue != nil ? optionalValue! : defaultValue
// optionalValue ?? defaultValue と同じ

上記のコードは、三項条件演算子と強制的なアンラップoptionalValue!を使用して...

  • optionalValuenilでない場合、optionalValueでラップされた値にアクセス
  • optionalValuenilである場合、defaultValueを返す

nil-coalescing演算子は、この条件付きのチェックとアンラップを簡潔で読みやすい形式でカプセル化する、よりエレガントな方法を提供します。

短絡評価

optionalValueの値がnilでない場合、defaultValueの値は評価されません。
これは short-circuit(短絡評価)として知られています。

??演算子の使い方

以下の例では、nil-coalescing 演算子を使用して、デフォルトカラーとオプショナルなユーザー定義カラーを使い分けます。

コード1
let defaultColorName = "red"
var userDefinedColorName: String?   // 初期値はnil

String?として定義されたuserDefinedColorNameのデフォルト値はnilです。
userDefinedColorNameはオプショナル型であるため、nil-coalescing 演算子を使用して、使用する前に値を評価できます。
次のコードは、??演算子の結果として、変数colorNameToUseに文字列"red"が割り当てられます。

コード2
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName は nil
// よって、colorNameToUse に "red" が割り当てられる

userDefinedColorNamenilであるため、userDefinedColorName ?? defaultColorNameは、defaultColorNameの値"red"を返します。

userDefinedColorNameに具体的な値を割り当ててから、nil-coalescing 演算子によるチェックを再度実行すると...
デフォルトの代わりにuserDefinedColorName内にラップされた値が使用されます。

コード3
userDefinedColorName = "green"    // 具体的な値を割り当てると...
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName は nil じゃない
// よって、colorNameToUse に "green" が割り当てられる