【问题标题】:How could I handle dictionary in Swift 3我如何在 Swift 3 中处理字典
【发布时间】:2018-12-12 16:52:25
【问题描述】:

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

进一步我想将所有用户名存储在一个数组中怎么做?

【问题讨论】:

  • contactsDic[0]Dictionary,真的有用吗?您可以迭代字典(用于键/值),在您的情况下,值将是字典。我建议使用任何其他 Swift 方法。然后应该完成一个明确的循环,因为你是一个初学者,这是基本的算法。见那里:stackoverflow.com/questions/24111627/…
  • 您的数据是[[String: Any]]。注意数组。

标签: ios firebase dictionary firebase-realtime-database swift3


【解决方案1】:

你有几个问题合二为一,所以我将用代码解决它们。以下代码可以缩短;我让它有点冗长以显示流程,并且我还添加了一些可以改进的错误检查。

请注意,为简洁起见,我用 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 是一个指向我的 Firebase 的类 var。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多