Как мне справиться со словарем в Swift 3 - PullRequest
0 голосов
/ 04 июля 2018

Я новичок, работаю с firebase. Я загрузил словарь из базы данных firebase, который выглядит следующим образом:

["bkayfdbUpJXDEpVF8WWl362amct2": {
    Email = "s@s.com";
    Name = "abce";
    Username = "abce";
}, "4gQHKfSAHmXU5q7rOP45OeN8yrz1": {
    Email = "f@f.com";
    Name = "abcq";
    Username = "abcq";
}, "OI0ppw6jSeW4Ao2nRff8Yq9uk162": {
    Email = "a@a.com";
    Name = "asd";
    Username = "asd";
}, "zbNvoAmunpVUkeQtt09r2RLaSqv1": {
    Email = "d@d.com";
    Name = "abcs";
    Username = "abcs";
}]

Я хочу напечатать имя пользователя, присутствующее в этом ключе "4gQHKfSAHmXU5q7rOP45OeN8yrz1" Я попробовал следующий код, но он не работает

let refContacts = FIRDatabase.database().reference().child("allUsers")        
refContacts.observeSingleEvent(of: .value, with: { (snapshot) in            
    if let contactsDic = snapshot.value as? Dictionary<String,Any> {
        print(contactsDic[0]["4gQHKfSAHmXU5q7rOP45OeN8yrz1"].["Name"]])                
    } else {                           
    }            
})

Далее я хочу хранить все имена пользователей в массиве, как это можно сделать?

1 Ответ

0 голосов
/ 04 июля 2018

У вас есть несколько вопросов в одном, поэтому я отвечу на них кодом. Следующий код может быть сокращен; Я оставил его немного подробным, чтобы показать поток, и добавил небольшую проверку ошибок, которая может быть улучшена.

Обратите внимание, что я заменил ключи uid_0 и uid_1 для краткости.

//a class to store the firebase data in an array
class ContactClass {
    var key = ""
    var email = ""
    var name = ""
    var username = ""

    convenience init(fromSnapshot snap: DataSnapshot) {
        self.init()
        self.key = snap.key

        if let dict = snap.value as? [String: Any] {

            let e = dict["Email"] as? String ?? ""
            let n = dict["Name"] as? String ?? ""
            let u = dict["Username"] as? String ?? ""

            self.email = e
            self.name = n
            self.username = u
        }
    }
}

var contactArray = [ContactClass]() //array to hold data read from Firebase

//read all of the contacts, create a class for each and store in an array
//then print their keys and filter the array for a specific key and print the name
func contactAction() {
    let refContacts = self.ref.child("allUsers")
    refContacts.observeSingleEvent(of: .value, with: { (snapshot) in

        for child in snapshot.children {
            let childSnap = child as! DataSnapshot
            let contact = ContactClass(fromSnapshot: childSnap)
            self.contactArray.append(contact)
        }

        for c in self.contactArray {
            print(c.key) //prints uid_0 and uid_1
        }

        let filteredContactResult = self.contactArray.filter { $0.key == "uid_1"}

        if let firstResult = filteredContactResult.first {
            let name = firstResult.name
            print(name) //prints asd
        }
    })

Вероятно, есть 100 других способов сделать те же самые задачи; этот метод будет поддерживать порядок и позволит легко фильтровать прочитанные данные.

О - вы используете более старую версию Firebase (из-за FIRDatabase), поэтому было бы неплохо обновить вашу Firebase до текущей версии.

self.ref, использованный в приведенном выше коде, является классом var, который указывает на мою Firebase.

...