[iOS swift] swift演算子の ?? って何?

2016/04/12

こんにちは。きんくまです。
今回は小ネタです。

サンプルプロジェクトを作ってみたら ?? 演算子があったので何かなと思って調べてみました。

Appleさんの公式
>> Nil Coalescing Operator

coalesce という単語がわかんなかったので、調べたら 「結合する」とか書いてあるので、直訳すると「nil結合演算子」でしょうか? とりあえず名前はおいておいて。

で、どういうのかというと、こんな感じにデフォルトの値を入れるときに便利みたいです。JavaScriptの || みたいな感じ?

let a:Int = 5
var b:Int?

let c:Int = b ?? a
print("\(c)") //5

これはこういう三項演算子の短縮系だそうです。

let a:Int = 5
var b:Int?

let d:Int = b != nil ? b! : a

if文を使ってかけばこうなりますね。

let a:Int = 5
var b:Int?

var e:Int
if b != nil {
    e = b!
}else{
    e = a
}
print("\(e)")

関数の引数チェックに

引数がnilだったらデフォルトの値を入れてみる。

func greeting(message:String?) -> String {
    let myMessage:String = message ?? "Hello"
    return myMessage + " world"
}

でもこうしなくてもデフォルト引数がかけるので、上のはこうも書けるのかなと思って書いてみた。

func greeting2(message:String? = "Hello") -> String {
    return message! + " world"
}

そしたら、nil チェックを無視しちゃうので実行時エラーがおきる場合がありました。

greeting2() //Hello world

greeting2(nil) //実行時エラーです!!

なので、実行時エラーがおきなくするには、message引数の型を String? から String にしてnilを許容しないようにしないといけません。でもそうすると、一番始めの greeting とは完全に一致しないですね。だから ?? 演算子は有効かもしれないです。

func greeting2(message:String = "Hello") -> String {
    return message + " world"
}

関数の実行結果にnilが返ってくるかもしれないので

関数の実行結果にnilが返ってくるかもしれない場合に使っても便利かも。

サンプルで、引数を2で割る関数を考えます。ただし、引数が奇数の場合は nil を返すとします。
そしたらこんな感じでしょうか。

func halfInt(num:Int) -> Int? {
    if num % 2 != 0 {
        return nil
    }
    return num / 2
}

let defaultNum:Int = 2

let n1:Int = 3
let result1:Int = halfInt(n1) ?? defaultNum
print("\(result1)") //2

let n2:Int = 6
let result2:Int = halfInt(n2) ?? defaultNum
print("\(result2)") //3

短縮系の演算子なので、なくても問題はないけど、知ってるとすっきりきれいにかけて便利。そんな演算子でした。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る