mar-gitacount
@mar-gitacount (mar mar)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

SwiftUI×Firebaseのスナップショットエラーについて

解決したいこと

swiftUiでRealTimeDatebaseを使いたいが、スナップショットエラーが出力されてしまう。

iosアプリ作成に着手しているのですが、バックエンド開発を1から着手するのは、現実味がないと感じ、firabaseを利用し、
アプリ作成をしようと考えております。

参考にしたのは以下の方の記事です

発生している問題・エラー

一つ目

Value of optional type 'DataSnapshot?' must be unwrapped to 
refer to member 'exists' of wrapped base type 'DataSnapshot'
Chain the optional using '?' to access member 'exists' only for non-'nil' base values

Force-unwrap using '!' to abort execution if the optional value contains 'nil'

二つ目

Value of optional type 'DataSnapshot?'
 must be unwrapped to refer to member 'value' of wrapped base type 'DataSnapshot
Chain the optional using '?' to access member 'value' only for non-'nil' base values
NameError (uninitialized constant World)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

import SwiftUI
import FirebaseDatabase

struct testdb: View {
    @State var message = ""
    
    var body: some View {
        VStack {
            Text(message)
                .padding()
        }.onAppear {
            let ref = Database.database().reference()
            ref.child("message").getData { (error, snapshot) in
                if let error = error {
                    print("Error getting data \(error)")
                }
                else if snapshot.exists() {
                    guard let message = snapshot.value as? String else {
                        return
                    }
                    self.message = message
                }
                else {
                    print("No data available")
                }
            }
        }
    }
}

struct testdb_Previews: PreviewProvider {
    static var previews: some View {
        testdb()
    }
}

自分で試したこと

swiftUiのプロジェクト登録完了。
利用しているDB:REALTIMEDATABASE

何か少しでもわかることがあればご教授いただければ幸いです。

0

1Answer

...
if let error = error {
    ...
} else if snapshot.exists() { // ← non-nilでないとexists()は使えない
    guard let message = snapshot.value as? String else {
    return
}
self.message = message
}
...

エラーから推測できることはsnapshotnon-nilじゃないとexists()valueもアクセスできないということです。なので!をつけて強制アンラップするか、確実にnil出ない状態にしてください。(強制アンラップはあまりお勧めできませんが)

if let error = error {

} else if let snapshot = snapshot {
    if snapshot.exists() {
        ...
}

このようにすればエラーを解消できるかと思います

1Like

Comments

  1. @mar-gitacount

    Questioner

    @hidetoさん解答ありがとうございます。
    上記のようにコードを書き直したところ、エラーが消えました!!
    今度はデータベースの値が表示されないという別問題にぶち当たりましたが、、
    とりあえずはその値が表示されないという部分を考えていきたいです。
    swiftはphpなどと比べると厳密な型宣言なんですね、しっかりそのへんを勉強していきたいです、、
  2. リアルタイムデータベースのドキュメントを読むと解決できるかもしれませんね🤔
    Swiftも型推論がありますが複雑になると圧倒的にパフォーマンスが落ちるので型はしっかりと指定する癖をつけた方がいいと思います☺️

Your answer might help someone💌