Edited at

[Swift] 三項演算子のハマり所

More than 5 years have passed since last update.


bool値による分岐


okの例

var boolValue = true

var ret1 = boolValue ? "a" : "b" // ret1 = "a"
var ret2 = !boolValue ? "a" : "b" // ret2 = "b"


  • 論理否定演算子「!」もC, Objective-Cと同じように使えます。


構文エラーの例

var boolValue = true

var ret1 = boolValue? "a" : "b" // 構文エラー
var ret2 = !boolValue? "a" : "b" // 構文エラー


  • 変数名の直後に半角スペースを置かずに?をつけると、「オプショナル型の宣言」と解釈されるためエラーになる。

  • 三項演算子の場合は?の前に半角スペースを忘れずに


nilかどうかによる分岐


okの例

var stringValue : String? = "hogehoge" // Optional型

var ret = stringValue ? "a" : "b" // ret = "a"
stringValue = nil
var ret2 = stringValue ? "a" : "b" // ret = "b"


構文エラーの例

var stringValue : String = "hogehoge" // Optional型ではない

var ret = stringValue ? "a" : "b" // 構文エラー: Type 'String' does not conform to protocol 'LogicalValue'


  • 評価に使う値がOptional型か否かによって挙動が異なる。

  • Optional型の場合、nilの場合はfalse、nil以外はtrueと評価される。

  • Optional型ではない場合は構文エラー。Optional型ではない値は、true/falseの評価には使えない。


文字列一致による分岐


okの例

var stringValue : String = "hogehoge"

var ret1 = stringValue == "hogehoge" ? "a" : "b" // ret1 = "a"
var ret2 = stringValue == "Hogehoge" ? "a" : "b" // ret2 = "b"


  • 値が等しいか判断する"=="演算子は大文字小文字を区別します


まとめ


  • Swiftの三項演算子はCやObje-Cと同じように使えますが、Optionalの?には注意しましょう。

  • 例によって、気になる点がありましたら気軽にコメントください!