例えばビューコントローラーAがビューコントローラーBを呼び出す事が決まっていて、AはBにデータCustomData
を渡して、Bはそれを使う事とします。
ビューコントローラーBで、このデータを保持する必要があります。
var customData: CustomData
ビューコントローラに、上記のようにプロパティを宣言すると、customData
が初期化されないのでビルドできません。
var customData = CustomData()
ダミーを入れれば、ビルドはできます。
しかし、ダミーはAから受け取ったデータで必ず置き換えられるので、メモリと処理時間の無駄です。CustomDataの初期化に必要な情報があったらそれもダミーで用意しなければならないなど、無駄が無駄を呼んでしまい、好ましくありません。
var customData: CustomData?
オプショナルを使うと、ダミーのような無駄が不要になります。
しかし、使うのにいちいち!や?をつけなくてはいけなくて面倒です。今回の場合、必ずAから渡される前提があるので、システム的にはcustomDataがnilにならない事が保証できています。保証できている事が表現できていないので、コードを見るたびに毎回この値は強制アンラップをしても大丈夫なのか、と考えなくてはなりません。
こういうときに、!を使います。
swift
1var customData: CustomData!
customDataはオプショナルなんですが、暗黙に強制アンラップされるので、まるでオプショナルではないかのように使えます。まるでオプショナルではないかのように見えるので、値がある前提であることも分かります。
ストーリーボードで作成して、コードに紐づけたオブジェクトは、この方法で宣言されています。それらはUIViewControllerを初期化する時点ではnilのままで、初期化のあと、ストーリーボードが読み込まれてオブジェクトの実体が作られ、それぞれのプロパティにアサインされます。もしこれがなかったら、ストーリーボードで定義したオブジェクトは全部オプショナルになってしまって、いちいちアンラップが必要で、非常に面倒な事になるところでした。
ところでこの宣言方法、なんていう名前なんでしょうね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/05 12:45
2020/02/05 14:09
2020/02/05 14:14
2020/02/05 14:41