Swift入門 オプショナルとアンラップ

以前はiOS開発ではObjective-Cを使ってましたが、最近はもうSwiftが主流になってきているとのこと。 そこでいっちょSwiftやってみるかと思って試しにiOSアプリを作ってみたりしました。
長いことクライアント開発から離れていたので、感覚を取り戻せるか心配してましたが、意外とObjective-Cでの経験を覚えていたので そこまで苦しい思いはしなかったです。とはいえ、全てすんなり行ったわけでもなく、ある程度は勉強が必要でした。
そこで今回は、Swiftの入門というスタンスで、オプショナル型とアンラップについて、簡単にメモします

オプショナル型とは

一言でいうと、「nil状態を許容する型」のこと。

nilを許容するというのがどういうことか。そもそもswiftという言語は基本的にnilを許容しない仕様になっているらしいです。 nil状態の変数が存在すると、アプリの異常終了に繋がりかねず、これを避けたいという意向がこのようなnil禁止の思想に繋がっているっぽいですね。 Xcodeでプログラムを書いていても、基本nilではない前提でコードチェックするので、nilの変数があると怒られるんです。
オプショナル型を使うことで、Xcodeがnilがありうるものと認識し、怒らなくなるというわけです。

オプショナルを使うケースとしては、IBOutletで紐付けを行うときに使うケースがあります。

@IBOutlet var btn:UIButton!
「!」マークが付いているのがオプショナルです



オプショナルの宣言と代入

オプショナル型を使うときの宣言方法は、大きく2つあります。「!」をつけるパターンと「?」をつけるパターンです。

var a:Int?
var str:String!
実は、「!」や「?」をつけて宣言すれば、IntでもStringでもなんでもオプショナル型にできるんです。ただ、 どのマークをつけて宣言するかで、アンラップが少し変わってきます。これは後述しますね。
値を代入するときも、IntやStringと同じように代入ができるので、そこは大きく変わりません。 では、オプショナル型になった変数に値を代入するとどうなっているのか。
var str:String? = "abcd"
=> Optional("abcd")
このように、「Optional(値)」のようになっており、代入した値をあたかもラップしたような形になっているのです。これは言い換えれば、 「Stringを持ってはいるが、String型ではない」ということになります。したがって、通常のStringと同じように扱うことができません。 Stringに限らず、Intでもなんでもこの仕組みは同じです。
では、代入した値を使うにはどうするか、そこでこのラップを解く、すなわちアンラップが登場するわけです。

アンラップの方法

「?」をつけてオプショナル型を宣言した場合は、「!」による明示的なアンラップが必要です。

var a:Int? = 2 # Optional(2) このままでは足し算はできない
var b:Int = 1 + a! # !をつけてアンラップし、2を取り出す
一方、「!」をつけてオプショナル型宣言をした場合は、上記のような明示的なアンラップは不要です。必要に応じて自動的にアンラップしてくれる素敵仕様で、 「!」をつけるとか何かを書く必要は全くありません。 暗黙のうちにアンラップしてくれるので、「暗黙的アンラップ」といいます。
var a:Int! = 2 # Optional(2)
var b:Int = 1 + a # 内部で自動でアンラップしてくれる

おわり

というわけで、オプショナル型とアンラップについて、簡単なメモでした。 今回はどういうものかをざっと書いただけで、どこでどのように使うかまでは書いてないですが、 少なくとも使うケースが生じた時にこのメモが役に立てばいいなと思いますね。
ではでは〜