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に移植するときは、このへんを考えながら書いたほうがよい。常に考えながら書くことが必要ですね