Implicitly Unwrapped Optionalsの使用例を説明する前に、SwiftのOptionalsとImplicitly Unwrapped Optionalsについて理解しておく必要があります。そうでない場合は、まずオプションに関する私の記事を読むことをお勧めします
暗黙的にアンラップされたオプションを使用する場合
Implicitly Unwrapped Optionalを作成する主な理由は2つあります。nil
それ以外の場合、Swiftコンパイラーは常にオプションを明示的にアンラップするように強制するため、アクセスされない変数を定義する必要があります。
1.初期化中に定義できない定数
すべてのメンバー定数は、初期化が完了するまでに値を持つ必要があります。場合によっては、定数は初期化中に正しい値で初期化できないことがありますが、アクセスされる前に値があることが保証されます。
オプション変数を使用すると、このオプションが自動的に初期化されnil
、最終的に含まれる値が不変になるため、この問題を回避できます。しかし、確かにnilではないことがわかっている変数を常にアンラップするのは、骨の折れる作業です。暗黙的にアンラップされたオプションは、オプションと同じ利点を達成しますが、すべての場所で明示的にアンラップする必要がないという利点があります。
この良い例は、ビューが読み込まれるまで、UIViewサブクラスでメンバー変数を初期化できない場合です。
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
ここでは、ビューが読み込まれるまでボタンの元の幅を計算できませんが、ビューのawakeFromNib
他のメソッド(初期化以外)の前に呼び出されることがわかっています。値をクラス全体で無意味に明示的にアンラップするのではなく、暗黙的にアンラップしたオプションとして宣言できます。
2.アプリが変数から回復できない場合 nil
これは非常にまれなはずですが、変数nil
にアクセスしたときにアプリが実行を継続できない場合、わざわざ変数をテストするのは時間の無駄になりますnil
。通常、アプリの実行を継続するために絶対的に真でなければならない条件がある場合は、を使用しassert
ます。暗黙的にアンラップされたオプションには、nilのアサートが組み込まれています。それでも、オプションのラップを解除し、それがnilの場合はより記述的なアサートを使用することはしばしば良いことです。
暗黙的にアンラップされたオプションを使用しない場合
1.遅延計算されるメンバー変数
nilであってはならないが、初期化時に正しい値に設定できないメンバー変数がある場合があります。1つの解決策は、暗黙的にアンラップされたオプションを使用することですが、より良い方法は遅延変数を使用することです。
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
現在、メンバー変数contents
は、最初にアクセスされるまで初期化されません。これにより、クラスは初期値を計算する前に正しい状態に入る機会が与えられます。
注:これは上記の1と矛盾するように見えるかもしれません。ただし、重要な違いがあります。buttonOriginalWidth
上記は、プロパティにアクセスする前に、ボタンを変更し、誰もが幅防ぐためのviewDidLoad中に設定する必要があります。
2.その他の場所
ほとんどの場合、Implicitly Unwrapped Optionalsは回避する必要があります。誤って使用すると、アプリケーションのアクセス中にアプリケーション全体がクラッシュするためですnil
。変数をnilにできるかどうか不明な場合は、常にデフォルトで通常のオプションを使用します。決してnil
確実ではない変数をアンラップしても、それほど害はありません。
if someOptional
。今後は使用できません。