Как вернуть значение сопоставленных данных, заданное ключом в Swift? - PullRequest
0 голосов
/ 30 сентября 2019

Я создаю запрос Firebase, который возвращает набор данных, которые я конвертирую в карту. Затем я пытаюсь получить доступ к значению в ключе "postScore", но получаю сообщение об ошибке "Невозможно добавить значение типа '[String]" с индексом типа "String". Я также пытался использовать «значение (forKeyPath:)» безрезультатно.

func getAccountScore(){
        let postsRef = db.collection("posts")
        let query = postsRef.whereField("UID", isEqualTo: Auth.auth().currentUser?.uid)
        query.getDocuments(){ (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                self.numberOfPosts = querySnapshot!.count
                print("number of posts: \(self.numberOfPosts)")
                for document in querySnapshot!.documents {
                    let dataDescription = document.data().map(String.init(describing:)).sorted(by: >)

                    print(dataDescription["postScore"])
                }
            }
        }
    }

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

document.data() тип возврата является необязательным Dictionary согласно документации , поэтому вы должны получить postScore, как показано ниже,

let postScore = document.data()?["postScore"]
print(postScore)

В настоящее время вы пытаетесь лечитьArray из String (который вы создали, используя .map{}) в качестве словаря для получения значения postScore, но компилятор не позволит использовать Array в качестве Dictionary.

1 голос
/ 03 октября 2019

Непонятно, что вы собираетесь делать с dataDescription, но на первый взгляд кажется, что вы просто пытаетесь получить postScore из каждого поста.

@ Kamran ответ потрясающий, но вот альтернатива Firestoreпуть;вы можете использовать .get для доступа к любым дочерним полям в документе.

for doc in snapshot!.documents {
    let key = doc.documentID
    let postScore = doc.get("postScore") as? String ?? "No Score"
    print(key, postScore)
}

Обратите внимание, что я добавил несколько слияния nil на случай, если документ отсутствует postScore, приложение не будет сбоить или иметь нольвар.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...