@IBOutlet weak var label :UILabel !
このオプショナル型の変数宣言で初期値が省略されており省略されている場合は自動的にnilが入るて参考書に書いてあるが、オこの書き方は変数にnilが入らない時にしか書けないとも書いてあり矛盾していませんか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
swift
1@IBOutlet weak var label :UILabel!
最後の!
が重要です。
通常のOptional型は
swift
1var a: UILabel?
のように最後は?
です。
この場合、その値にアクセスするには通常アンラップなどの操作が必要になります。
swift
1a?.text = "New Text"
これはオプショナルチェーンという方法でa
がnil
の場合はそのあとの部分の処理はすべてキャンセルされます。
ご覧のようにa
の後ろに?
が必要です。
ところが、!
を用いた宣言の場合アンラップは必要ありません。
つまり
swift
1label.text = "New Text"
として構わないということです。
この!
を使った宣言をImplicity Unwrapped Optionalといいます。
ここからが「変数にnilが入らない時にしか書けない」の部分です。
Implicity Unwrapped Optionalはプログラマに注意が与えられています。
それは「その値がnilであるときは致命的なエラーであり回復するすべがない」時にのみ使用するべきであるというものです。
Implicity Unwrapped Optionalが@IBOutletでよく使われるのは存在するはずのUI要素が存在しなければアプリとして機能しないことがほとんどのためです。
@IBOutletはStoryboardなどからそのクラスのインスタンスが生成された場合は、システム側がStroyboardの接続に合わせて値を代入しますので、正しい手続きが取られていれば(ロード後は)nilではありません。
つまり、「変数にnilが入らない時にしか書けない」とは「nilになりうる場合は使ってはならない」という意味です。
これはプログラマが注意しなければならないものです。コンパイラからのサポートはありません。
追記
アンラップしなくても使えてしまうため、プログラマがOptional - nilになりうる - ということを意識から外してしまいバグを生んでしまう可能性があるためこのような注意がされています。
投稿2019/12/09 07:57
編集2019/12/09 08:39総合スコア3391
0
この書き方は変数にnilが入らない時にしか書けない
その変数がnilがのときにその変数を参照するとアプリが落ちます。
つまり、そのようなロジックでは使えないから、書けない。
「初期化時はnilだが、その変数を使用する時にはインスタンスが入っている」ことが前提の時に、この表記ができます。
投稿2019/12/09 04:55
総合スコア1682
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/09 12:51
0
省略されている場合は自動的にnilが入る
(変数の値を使うときに)nilが入らない時にしか書けない
UILabel!
型の変数はUILabel
またはnil
を入れることができる。- 宣言時に初期値を入れなければ、初期値は
nil
になる。 - 変数にアクセスするときに中身が
nil
だと実行時エラーになる。 - したがって、変数にアクセスする段階で中身が
nil
でない場合でのみ使用すべきである。
投稿2019/12/09 04:39
編集2019/12/09 07:02総合スコア13551
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。