Help us understand the problem. What is going on with this article?

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" が割り当てられる
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした