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

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

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

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Q&A

0回答

277閲覧

Firestoreのデータを取得したいが、Unexpectedly found nil while unwrapping an Optional valueと表示される

avocadoningen

総合スコア14

Firebase

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

0グッド

0クリップ

投稿2022/09/03 10:16

前提

XcodeでFirestoreのデータを取得しようとしています。
ビルドは成功するのですが、シミュレーターで実行するとうまくいきません。
プロジェクトとFirebaseは連携できていることは確認できています。
回答していただけると大変ありがたいです。
よろしくお願いします。

実現したいこと

初期化を成功させ、Firebaseのデータを正確に渡すこと。

発生している問題・エラーメッセージ

LocationsViewModel.swiftの3行目

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

該当のソースコード

LocationsViewModel.swift

1init() { 2 let locations = FirebaseViewModel().stores 3 self.locations = locations 4 self.mapLocation = locations.first! 5 self.updateMapRegion(location: locations.first!) 6 }

FirebaseViewModel.swift

1import SwiftUI 2import FirebaseFirestore 3import MapKit 4 5class FirebaseViewModel: ObservableObject { 6 @Published var stores = [Location]() 7 8 9 func getData() { 10 11 let db = Firestore.firestore() 12 13 db.collection("stores").getDocuments { snapshot, error in 14 if error == nil { 15 // No errors 16 if let snapshot = snapshot { 17 DispatchQueue.main.async { 18 self.stores = snapshot.documents.map { d in 19 return Location(name: d["name"] as? String ?? "", 20 category: d["category"] as? String ?? "", 21 link: d["url"] as? String ?? "", 22 description: d["description"] as? String ?? "", 23 coordinates: d["coordinates"] as! GeoPoint, 24 id: d.documentID) 25 } 26 } 27 } 28 } 29 else { 30 } 31 } 32 33 } 34} 35

Locations.swift

1import Foundation 2import MapKit 3import FirebaseFirestore 4 5struct Location: Identifiable, Equatable { 6 7 var name: String 8 var category: String 9 var link: String 10 var description: String 11 var coordinates: GeoPoint 12 var id: String 13 14 static func == (lhs: Location, rhs: Location) -> Bool { 15 lhs.id == rhs.id 16 } 17 var locationCoordinate: CLLocationCoordinate2D { 18 CLLocationCoordinate2D( 19 latitude: coordinates.latitude, 20 longitude: coordinates.longitude) 21 } 22 23 struct Coordinates: Hashable, Codable { 24 var latitude: Double 25 var longitude: Double 26 } 27 28}

補足情報(FW/ツールのバージョンなど)

macOS バージョン12.4 1.1GHz 4コアIntel Core i5
Xcodeバージョン13.4.1

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

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

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

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

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

hoshi-takanori

2022/09/03 12:47

エラーが出てるのは self.mapLocation = locations.first! でしょうか? この locations は、新しく作った FirebaseViewModel オブジェクトの stores なので、空の配列だからでしょうね。
avocadoningen

2022/09/03 12:50

はい、空の配列であることはわかるのですが、原因がわからないのです、、、
hoshi-takanori

2022/09/04 04:30

stores の初期値は空の配列で、getData メソッドを呼ぶと非同期で Firebase から値を取得するようですが、非同期なので値を取得するまでは空ですし、ネットが繋がってないなど、値が取得できない場合もあるでしょう。 というか、そもそも新しく作った FirebaseViewModel オブジェクトの stores にアクセスしてるので常に空の配列ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問