LoginSignup
21
18

More than 5 years have passed since last update.

IBOutletはなぜ" ! "で定義すべきか

Last updated at Posted at 2018-02-24

背景

controlキーを押しながらstoryboardの部品とコードの紐付けを行うと接続のためのコードが生成されます。

@IBOutlet weak var myLabel: UILabel!

その際どうして"!"(暗黙的アンラップ型)で定義されるのか、疑問に思ったので調べました。

結論

1.IBOutletがnilになる可能性があるため、オプショナル型にする必要があるから。
2.コードをより簡潔に書くため、アンラップする手間を省く必要があるから。

では、それぞれの理由について詳しくみていきましょう。

オプショナル型にするのはなぜか

swiftの規約を参照してみましょう。

Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.

あるクラスのインスタンスを生成するときには、すべての変数に値がセットされているか、nilであることを許容するオプショナル型にしておく必要があります。

例えば下記の場合。

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

ViewControllerのインスタンスを生成するとき、Labelの値は確定していません。
そのため、値が入っていないこと(nil)を許容するオプショナル型にしておく必要があります。
たとえstoryboardと部品の紐付けをしていたとしても、オプショナル型にしていないとエラーになります。

これはなぜかというと、
1.ViewControllerのインスタンスを生成する
2.IBOutletを読み込む
という流れでXcodeが処理を行うからです。

そんなわけで、IBOutletはオプショナル型("?"か"!")で定義しないとエラーになってしまいます。

では"?"ではなく"!"で定義するのはなぜでしょうか。

アンラップする手間を省くとは

    @IBOutlet weak var myLabel: UILabel?

と定義することもできますが、後でアンラップするために書かなければいけないコードが増えます。

※ そもそもアンラップって何?という方は、この記事がわかりやすいと思います。
 どこよりも分かりやすいSwiftの"?"と"!"

storyboardの部品との接続を忘れていない限り
IBOutletには必ず値が入っているので、わざわざアンラップするのは面倒ですよね。

そのため、IBOutletは"?"ではなく"!"で定義します。

参照した記事

Should Outlets Be Optionals or Implicitly Unwrapped Optionals

21
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
18