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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

2回答

3003閲覧

【Swift】クラスのインスタンス化について

duck015

総合スコア29

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

1グッド

1クリップ

投稿2020/02/05 06:00

編集2020/02/05 06:08

お聞きしたいこと

var 変数名: クラス名!はどのような場合に使うのでしょうか?

var 変数名 = クラス名()では、クラスをインスタンス化することによって、そのクラスが持つ変数やメソッドにアクセスできると思いますが、上記コードも同じような機能を持っているかと思います。

個人的にはvar 変数名: クラス名!はただ宣言をしているだけの理解ですが(printしてみてもnilになるため)、
使いどころがいまいち分からず、これらをどのように使い分けるべきか、初歩的な質問で恐縮ですが、ご教示いただけませんでしょうか?

eytyet👍を押しています

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

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

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

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

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

guest

回答2

2

ベストアンサー

例えばビューコントローラーAがビューコントローラーBを呼び出す事が決まっていて、AはBにデータCustomDataを渡して、Bはそれを使う事とします。

ビューコントローラーBで、このデータを保持する必要があります。

var customData: CustomData

ビューコントローラに、上記のようにプロパティを宣言すると、customDataが初期化されないのでビルドできません。

var customData = CustomData()

ダミーを入れれば、ビルドはできます。
しかし、ダミーはAから受け取ったデータで必ず置き換えられるので、メモリと処理時間の無駄です。CustomDataの初期化に必要な情報があったらそれもダミーで用意しなければならないなど、無駄が無駄を呼んでしまい、好ましくありません。

var customData: CustomData?

オプショナルを使うと、ダミーのような無駄が不要になります。
しかし、使うのにいちいち!や?をつけなくてはいけなくて面倒です。今回の場合、必ずAから渡される前提があるので、システム的にはcustomDataがnilにならない事が保証できています。保証できている事が表現できていないので、コードを見るたびに毎回この値は強制アンラップをしても大丈夫なのか、と考えなくてはなりません。

こういうときに、!を使います。

swift

1var customData: CustomData!

customDataはオプショナルなんですが、暗黙に強制アンラップされるので、まるでオプショナルではないかのように使えます。まるでオプショナルではないかのように見えるので、値がある前提であることも分かります。

ストーリーボードで作成して、コードに紐づけたオブジェクトは、この方法で宣言されています。それらはUIViewControllerを初期化する時点ではnilのままで、初期化のあと、ストーリーボードが読み込まれてオブジェクトの実体が作られ、それぞれのプロパティにアサインされます。もしこれがなかったら、ストーリーボードで定義したオブジェクトは全部オプショナルになってしまって、いちいちアンラップが必要で、非常に面倒な事になるところでした。

ところでこの宣言方法、なんていう名前なんでしょうね。

投稿2020/02/05 08:04

eytyet

総合スコア803

duck015, TsukubaDepot👍を押しています

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

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

TsukubaDepot

2020/02/05 12:45

Implicitly Unwrapped Optional(IUO)とか、暗黙的オプショナル値(一般的な記述)、有値オプショナル値(萩原剛志著・詳解Swift第5版105ページ)と呼ばれているみたいですね。
eytyet

2020/02/05 14:09

ありがとうございます!名前がわかるとQiitaの記事なども見つかりますね。助かりました。
TsukubaDepot

2020/02/05 14:14

こちらこそ有益な情報ありがとうございます。 私はまだSwiftの勉強中で、かつ私も実践的な使い方について理解が及んでいなかったのですが、実例を交えて解説していただけたおかげで理解が深まりました。
duck015

2020/02/05 14:41

お二方詳しいご説明ありがとうございました! おかげさまで理解することができました。
guest

2

ただ宣言をしているだけの理解ですが(printしてみてもnilになるため)

確かに実際に値を入れないと使えないです。(nilになってしまう)

インスタンスの初期化時は値はないが、オプショナルにしたくない時に使用します。
(あとから値を入れる前提で運用する必要がある)

後々、値を入れたりして使用する際に、オプショナルだと逐一unwarpするか?が必要になり都合が悪いかったりするので、そうすることがあります。

VIPERなどアーキテクチャー周りを導入するとこういったコードの便利さに触れれるかもしれません。

あとはkotlinのlate initにニュアンスは近いですね。

投稿2020/02/05 06:48

h_crane

総合スコア171

duck015, miyabi_pudding👍を押しています

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問