こんにちは。きんくまです。
今回は小ネタです。
サンプルプロジェクトを作ってみたら ?? 演算子があったので何かなと思って調べてみました。
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
短縮系の演算子なので、なくても問題はないけど、知ってるとすっきりきれいにかけて便利。そんな演算子でした。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ