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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

279閲覧

snapshot.valueのアンラップ

sam3457

総合スコア52

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/04/17 09:22

こちらを参考にFirebaseを利用したアプリを作っています。
該当部分(こちらは正常に動作していました)
イメージ説明

以下の様にFirebaseRDBからデータを引き出す時、アンラップしたのに起動時にnilが出てしまうのですが
これは何が原因となっているのでしょうか?

以下が私のコードです

switf

1func loadPosts() { 2 Database.database().reference().child("posts").observe(.childAdded, with: { (snapshot) in 3 if let dict = snapshot.value as? [String: Any] { 4 let captionText = dict["caption"] as! String 5 let photoUrlString = dict["photoUrl"] as! String 6 let post = Post(captionText: captionText, photoUrlString: photoUrlString) 7 self.posts.append(post) 8 print(self.posts) 9 self.tableView.reloadData() 10 } 11 }) 12 }

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの意味としてはdict["caption"]はString型にダウンキャストできなかったという意味でしょう。
as!はas?でキャストしたオプショナル型の値を強制アンラップする流れになりますので、そもそものキャストに失敗していればこのエラーとなります。
このクラッシュする呼び出し時にdict["caption"]の結果が存在していないのでは無いでしょうか?
printなりdebugなりで調べてみてはいかがでしょうか。

このdict["caption"]が取れなかった(正しくキャストできなかった)場合にアプリもろともクラッシュすべきかどうかは一つの論点になります。
場合によっては取れない場合もあり、取れなくてもアプリが正しく継続できる場合は、上のif let文にキャストも組み込むと簡潔、安全に記述できます。
※どうせif letしているならキャストも組み込んでしまおうという発想です。

swift

1 if let dict = snapshot.value as? [String: Any], 2 let captionText = dict["caption"] as? String, 3 let photoUrlString = dict["photoUrl"] as? String { 4 let post = Post(captionText: captionText, photoUrlString: photoUrlString) 5 self.posts.append(post) 6 print(self.posts) 7 self.tableView.reloadData() 8 } 9```さほど複雑にならずに安全なキャストができます。 10一方で特定の環境、タイミングでキャストの失敗が発生していてもクラッシュより発見が遅れる可能性も高いです。

投稿2018/04/17 11:00

516k

総合スコア189

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

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

sam3457

2018/04/17 11:52

回答ありがとうございます! ダウンキャストできなかった結果がnil担になっていたのですね、、 516k様のおっしゃる通りにコンソールでcaptionを確認して見たところ、一件だけcaption項目が存在しないpostデータがありました。 このpostを一件だけコンソールから削除したところ、正常に動作致しました。 if let でこういう書き方もできるのですね、、こちらでも試して見ます。 キャストについてももっとよく勉強する必要がありますね、、 ありがとうございます!
JohnFernando

2018/08/20 09:44

全く同じ事故に遭遇しました 笑 解決できたのでお二人さんに感謝です!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問