もくもくろぐ

技術力

Swift の Optional Value を便利だと思った話

思いました。

最近は、仕事でも趣味でもSwiftを書いています。
いろいろ知見がたまってきて、特にOptional Valueが最高だと感じることができたので共有したいと思います。

Optional Value とは

[Swift] Optional型についてのまとめ - Qiita

The Swift Programming Language: The Basics

Optional Value がなんであるかは、これらのリンクを見るといいと思います。日本語の記事たくさんあったけどやっぱり公式リファレンスが最強

null チェック

null (nil) チェックをすることは落ちないアプリを作る上でとても大切なことです。 そもそもnilを許容しないならば特になにもしなくていいんですが、nilの入る可能性があるときは少々気をつけなければいけません。

コンパイルエラー

多くの記事で触れられているのはこれですね。

var str: String! = "mokumoku"
str = nil

こうすると、 str = nil の場所でエラーを吐きます。実行する前にエラーを防げてよかったですね。

実行時エラー

アプリ制作者が恐ろしいのは実行時エラーです。どこで落ちたのかをBreakpoint張ってつかまえて、コールスタックを見て…。幾度となく行った動作ですが、できればあまりしたくないですね。

Swiftで実行時にnil代入が起きるのは Optional Value を使っているときだけです。普通の状態だとそもそもnilオブジェクトはコンパイル時にエラーになるので。 単純にアンラップしてしまうとObjective-Cと何も変わりません。

var obj = hoge() as? AnyObject
let element: AnyObject! = obj!.element

よくわかってないまま(コンパイルエラーを解消しようと)アンラップすると上のようなコードが出来上がるのですが、もちろん obj が nil だった場合は落ちます。 ではどうすればよいか。nilチェックをしましょう。

単純にチェックする

先ほどの落ちるコードを書き直すとこうなります。

var obj = hoge() as? AnyObject
if obj != nil {
    let element = obj!.element
}

なんだかObjective-C時代と変わらないですね。

Optional Binding が特に便利

Optionalでラップされたオブジェクトを判定する方法です。Optional Binding といいます。
obj? があるとすると、 if let obj_nonnil = obj とすることで、以降はnon-nilが保証されたオブジェクトを扱うことができます。

let obj = hoge() as? AnyObject
if let obj_nonnil = obj {
    let element = obj_nonnil.element
}

こんな感じ。non-nilが保証されているオブジェクトを以降はあれこれすればいいのでとても安心ですね。 それに、参照するときにいちいち ! をつけなくていいのでラクチンです。

まとめ

  • nullチェックには Optional Binding を使え
感想

かなり便利で安全になったので、Objective-CのコードをSwiftに移植するときは、このへんを考えながら書いたほうがよい。常に考えながら書くことが必要ですね