我如何处理 Swift 中的字典 3

How could I handle dictionary in Swift 3

我是初学者,使用 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 {                           
    }            
})

此外,我想将所有用户名存储在一个数组中,该怎么做?

您将几个问题集中在一起,所以我将用代码来解决它们。以下代码可以缩短;为了显示流程,我把它留得有点冗长,而且我还进行了一些错误检查,这可以改进。

请注意,为了简洁起见,我替换了 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 { [=10=].key == "uid_1"}

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

可能有 100 种其他方法可以完成这些相同的任务;此方法将保持顺序并使过滤读取的数据变得非常容易。

哦 - 您使用的是旧版本的 Firebase(由于 FIRDatabase),因此最好也将您的 Firebase 升级到当前版本。

上面代码中使用的self.ref是一个指向我的Firebase的class变量。