2016-07-30 7 views
0

私は(オブジェクトライブラリからドラッグ)ビューラベルを作成し、ラベルのViewController(Ctrlキーとドラッグ)を接続するIBOutletを作るときは、Xcodeのことで生成されるデフォルトのコードがありますたとえば、@IBOutlet weak var displayColumn: UILabel!ラベルのデフォルトのタイプが強制アンラップオプションなのはなぜですか?

感嘆符を削除してUILableとすることができます。しかし、Xcodeがそれを強制的にアンラップされたオプションの型にしたいのは、正当な理由があるに違いありません。

質問:オプションのタイプを使用する理由はわかりません。私はすでに自分のビューにラベルを作成し、それをコントローラに接続しているので、そこには確かにあります。存在し、私はそれを作成しました。 Xcodeがオプションをデフォルトのタイプとして使用するのはなぜですか?ラベル内のテキストがオプションであるとすれば、ランタイム中のある時点でラベルが空になる可能性があるので、それは私には妥当なものです。

多くのおかげ

答えて

5

あなたはXcodeでラベルを作成し、そのラベルがその@IBOutletに接続したいとXcode向けすることを示しています。しかし、その接続は後で起こることはありません。

これは実行時のイベントの順序です。

  1. viewControllerが作成(インスタンス化)されます。
  2. ストーリーボードまたは.xibがアーカイブされていません。この時点でラベルが作成されます。
  3. @IBOutlet@IBActionが接続されています。

Swiftでは、クラスがインスタンス化されると、すべてのプロパティを初期化する必要があります。ステップ1では、コンセントはまだ接続されていないため、nilです。これを可能にするには、のオプションと宣言する必要があります。

次のような、通常のオプションを使用して完全に有効です:

@IBOutlet weak var displayColumn: UILabel? 

が、その後、あなたはそれをあなたがそれにアクセスするたびにアンラップに対処する必要があると思います。 @IBOutletが0になる唯一の時間は、ステップ3がまだ発生していない場合(たとえば、prepareForSegue)、またはコンセントを接続するのを忘れた場合や名前を変更した場合です。そのような場合は、nilにアクセスしてクラッシュすると、その旨が通知されます。

+0

あなたはすごく親切です。非常に良い説明、明確かつ堅実! – SLN

+0

良い説明 –

関連する問題