読者です 読者をやめる 読者になる 読者になる

ぺぷしのーげん

大企業からスタートアップに転職したアプリケーションエンジニアのブログ

SwiftのisEmptyはnilを返すこともある|最悪の場合は例外発生

isEmptyの振る舞いで混乱してしまったので、メモ書き。バージョンはXcode6.4です。ちなみにオプショナル型についての過去記事もよろしければ。

hazakurakeita.hatenablog.com 

 

isEmptyがnilを返すことがある

f:id:hazakurakeita:20150928215847p:plain

上図のcase5がそれに当たります。初期化していない非オプショナル型の配列は、オプショナル型か非オプショナル型かを明示するとisEmptyを呼び出すことができます。ビルドエラーにはなりません。このcase5をオプショナル型としてisEmptyを実行するとnilが返ってきます。更に、このcase5を非オプショナル型にアンラップすると何も返ってきません。例外が発生します。

また、case6のように初期化していないオプショナル型の配列も、明示することでisEmptyを呼び出し可能です。こちらの場合はcase6をオプショナル型、非オプショナル型どちらでisEmptyを実行しても例外が発生します。

 

要は複数の言語使用をまとめたイメージ

最初は混乱していたのですが、書いていると頭が整理できてきました。言語によって、配列がnullでもisEmptyはTrueを返したりNullExceptionをスローしたり仕様が変わってきます。しかし、Swiftはオプショナル型と非オプショナル型があるので、それぞれ仕様があるのですね。まさに複数言語の仕様がSwiftには実装されているイメージです。

 

じつはisEmptyだけではなかった

Countもそうでした。他の変数も同じなんだと思います。しかし、ライブラリやAPIを使用しているとnilの場合があるかどうか判断できないこともあるので、結局nilが入っている可能性があったら対応しないといけないんでしょうかね。そうなってしまうとオプショナル型の意味がなくなってしまうので、ちゃんと仕様や流れを理解してコード書くようにしないといけませんね。。あーオプショナル型奥が深いな。。

 

おしまい。