質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

3回答

717閲覧

Swiftのオプショナル型について

tom._

総合スコア7

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/12/09 04:30

@IBOutlet weak var label :UILabel !
このオプショナル型の変数宣言で初期値が省略されており省略されている場合は自動的にnilが入るて参考書に書いてあるが、オこの書き方は変数にnilが入らない時にしか書けないとも書いてあり矛盾していませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

swift

1@IBOutlet weak var label :UILabel!

最後の!が重要です。

通常のOptional型は

swift

1var a: UILabel?

のように最後は?です。
この場合、その値にアクセスするには通常アンラップなどの操作が必要になります。

swift

1a?.text = "New Text"

これはオプショナルチェーンという方法でanilの場合はそのあとの部分の処理はすべてキャンセルされます。
ご覧のように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
MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この書き方は変数にnilが入らない時にしか書けない

その変数がnilがのときにその変数を参照するとアプリが落ちます。
つまり、そのようなロジックでは使えないから、書けない。
「初期化時はnilだが、その変数を使用する時にはインスタンスが入っている」ことが前提の時に、この表記ができます。

投稿2019/12/09 04:55

dsuzuki

総合スコア1682

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tom._

2019/12/09 06:51 編集

初期値nilでも型指定でUILabel型しか入らないからその型ではないnilは入らないという理解ではおかしいですか?
dsuzuki

2019/12/09 12:51

> UILabel型しか入らない var label :UILabel! (@IBOutlet weak は関係無いので一旦無視します) この変数にUILabelのインスタンスが入っていても、nilで上書きできます(nilが入ります)。nilか否かの判定(== nil)も可能です。 ただし、そんなことをすると思わずnilのアンラップをしてしまい、アプリが落ちます。 ここから先は、MasakiHoriさんの回答が詳しく説明しています。
guest

0

省略されている場合は自動的にnilが入る
(変数の値を使うときに)nilが入らない時にしか書けない


  • UILabel!型の変数はUILabelまたはnilを入れることができる。
  • 宣言時に初期値を入れなければ、初期値はnilになる。
  • 変数にアクセスするときに中身がnilだと実行時エラーになる。
  • したがって、変数にアクセスする段階で中身がnilでない場合でのみ使用すべきである。

投稿2019/12/09 04:39

編集2019/12/09 07:02
ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問