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

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

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

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

Cloud Firestore

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

Swift

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

Q&A

解決済

1回答

617閲覧

throwsが見当たらないがtryキーワードがついている

grf__

総合スコア4

Firebase

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

Cloud Firestore

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

Swift

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

0グッド

0クリップ

投稿2023/02/19 10:47

実現したいこと

前提

https://firebase.google.com/docs/firestore/solutions/swift-codable-data-mapping?hl=ja#handling_errors
firestoreのドキュメントで理解できない記述を見つけたため質問させていただきたいです。
collectionRef.addDocument(from: newColor)の前に try がついていますが、これはなぜ記述しなければいけないのでしょうか。そしてどこにthrowsがあるのでしょうか。

swift

1 func addColorEntry() { 2 let collectionRef = db.collection("colors") 3 do { 4 let newDocReference = try collectionRef.addDocument(from: newColor) 5 print("ColorEntry stored with new document reference: \(newDocReference)") 6 } 7 catch { 8 print(error) 9 } 10 }

こちらはfirestoreドキュメントの別のサンプルコードですが、このコードではtryをつけずにaddDocumentメソッドを呼び出していて、違いがわかりません。
do,try,catch,throwsの基本的な文法は一応理解しているつもりです。
わかりづらい文章になってしまっているかもしれませんが、ご教授いただけますと嬉しいです。よろしくお願いいたします。

swift

1// Add a new document with a generated id. 2var ref: DocumentReference? = nil 3ref = db.collection("cities").addDocument(data: [ 4 "name": "Tokyo", 5 "country": "Japan" 6]) { err in 7 if let err = err { 8 print("Error adding document: \(err)") 9 } else { 10 print("Document added with ID: \(ref!.documentID)") 11 } 12}

念の為全てのコードを記載します。

swift

1class MappingColorsViewModel: ObservableObject { 2 @Published var colorEntries = [ColorEntry]() 3 @Published var newColor = ColorEntry.empty 4 @Published var errorMessage: String? 5 6 private var db = Firestore.firestore() 7 private var listenerRegistration: ListenerRegistration? 8 9 public func unsubscribe() { 10 if listenerRegistration != nil { 11 listenerRegistration?.remove() 12 listenerRegistration = nil 13 } 14 } 15 16 func subscribe() { 17 if listenerRegistration == nil { 18 listenerRegistration = db.collection("colors") 19 .addSnapshotListener { [weak self] (querySnapshot, error) in 20 guard let documents = querySnapshot?.documents else { 21 self?.errorMessage = "No documents in 'colors' collection" 22 return 23 } 24 25 self?.colorEntries = documents.compactMap { queryDocumentSnapshot in 26 let result = Result { try queryDocumentSnapshot.data(as: ColorEntry.self) } 27 28 switch result { 29 case .success(let colorEntry): 30 if let colorEntry = colorEntry { 31 // A ColorEntry value was successfully initialized from the DocumentSnapshot. 32 self?.errorMessage = nil 33 return colorEntry 34 } 35 else { 36 // A nil value was successfully initialized from the DocumentSnapshot, 37 // or the DocumentSnapshot was nil. 38 self?.errorMessage = "Document doesn't exist." 39 return nil 40 } 41 case .failure(let error): 42 // A ColorEntry value could not be initialized from the DocumentSnapshot. 43 switch error { 44 case DecodingError.typeMismatch(_, let context): 45 self?.errorMessage = "\(error.localizedDescription): \(context.debugDescription)" 46 case DecodingError.valueNotFound(_, let context): 47 self?.errorMessage = "\(error.localizedDescription): \(context.debugDescription)" 48 case DecodingError.keyNotFound(_, let context): 49 self?.errorMessage = "\(error.localizedDescription): \(context.debugDescription)" 50 case DecodingError.dataCorrupted(let key): 51 self?.errorMessage = "\(error.localizedDescription): \(key)" 52 default: 53 self?.errorMessage = "Error decoding document: \(error.localizedDescription)" 54 } 55 return nil 56 } 57 } 58 } 59 } 60 } 61 62 func addColorEntry() { 63 let collectionRef = db.collection("colors") 64 do { 65 let newDocReference = try collectionRef.addDocument(from: newColor) 66 print("ColorEntry stored with new document reference: \(newDocReference)") 67 } 68 catch { 69 print(error) 70 } 71 } 72}

試したこと

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

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

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

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

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

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

hoshi-takanori

2023/02/19 14:05

async は非同期処理のことで、例えば Firebase へのアクセスはネットワークが絡むので時間がかかり、結果を関数の戻り値で返そうとすると結果が返ってくるまで待つ必要があります。 で、addDocument(data:completion:) の場合はサーバーにリクエストを送信したらすぐに関数を抜けて、結果が帰ってきた時に改めて completion という引数で指定したクロージャが実行されます。 が、この書き方は読みづらいので、async/await というものを使うと普通に関数の結果を受け取っているかのように書くことができます。(実際にはクロージャで書いたのと同等の処理になります。) https://qiita.com/daiki_U/items/49f12b680850f797b2fb
MasakiHori

2023/02/20 06:48

`addDocument(from:`と`addDocument(data:`は別のものです。
grf__

2023/03/03 03:11

@hoshi-takanori様 ご返信が遅くなり申し訳ございません。 クロージャを使った非同期処理の方法しか知らなかったため大変勉強になりました。 async/awaitを勉強してみたいと思います。
grf__

2023/03/03 03:13

@MasakiHori様 ご返信が遅くなり申し訳ございません。 同一メソッドとして混同しておりました、ご回答ありがとうございました。
guest

回答1

0

ベストアンサー

collectionRef.addDocument(from: newColor)の前に try がついていますが、これはなぜ記述しなければいけないのでしょうか。そしてどこにthrowsがあるのでしょうか。

こちらで使用しているaddDocumentは、第一引数がfrom:指定になっています。これは、FirebaseFireStoreが提供しているメソッドではなく、FirebaseFireStoreSwiftが提供しているメソッドで、次の場所にAPIリファレンスがあります。

https://firebase.google.com/docs/reference/swift/firebasefirestoreswift/api/reference/Extensions/CollectionReference#adddocumentfrom:encoder:completion:

上記のリファレンスには throws がついており、tryで処理しなければならないことがわかると思います。

from:指定のaddDocumentメソッドはCodableに準拠した構造体を送信に使用できるメソッドで、FirebaseFireStoreSwiftは、Codableやasync/await等のSwiftの最新機能をFirebaseFireStoreで使用できるようにするための付加ライブラリです。(これを利用するためにFirebaseFireStoreSwiftのライブラリを追加インストールしているはずです。)

こちらはfirestoreドキュメントの別のサンプルコードですが、このコードではtryをつけずにaddDocumentメソッドを呼び出していて、違いがわかりません。

こちらで使用しているaddDocumentは、第一引数がdata:指定になっています。これは、FirebaseFireStoreが提供しているメソッド(最初から提供されているメソッド)で、次の場所にAPIリファレンスがあります。

https://firebase.google.com/docs/reference/swift/firebasefirestore/api/reference/Classes/CollectionReference#adddocumentdata:completion:

こちらはthrowsがついていないので、tryで処理する必要ありません。

投稿2023/02/20 13:18

編集2023/02/21 06:52
TakeOne

総合スコア6299

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

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

grf__

2023/03/03 03:20

ご回答ありがとうございます。 総括されていて大変わかりやすく、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問