要自定义的字典数组 Class
Array of Dictionaries to Custom Class
我已成功将我的 Firebase 数据提取到字典中,但我很难将值放入我的自定义 class。
要从 Firebase 获取数据,我使用以下代码:
func testing(completion: @escaping ([String : Any]) -> ()) {
ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
if let value = snapshot.value as? [String : Any] {
completion(value as [String : Any])
return
}
completion([:])
})
}
当我调用函数时
testing { (dictionary) in
print(dictionary)
}
我从 Firebase 取回的字典是这个(它是一个字典数组):
["name": custom chore list, "multiplier": 1, "assigned": none, "order": 0]
["name": bathrooms, "multiplier": 1, "assigned": none, "order": 1]
["name": laundry, "multiplier": 1, "assigned": none, "order": 2]
["name": living room, "multiplier": 1, "assigned": none, "order": 3]
["name": sweep & vacuum, "multiplier": 1, "assigned": sweep & vacuum, "order": 4]
["name": wipe table, "multiplier": 1, "assigned": none, "order": 5]
["name": counters, "multiplier": 1, "assigned": none, "order": 6]
["name": dishes, "multiplier": 1, "assigned": none, "order": 7]
["name": meal prep, "multiplier": 1, "assigned": none, "order": 8]
["name": feed pet / garbage, "multiplier": 1, "assigned": none, "order": 9]
我的习惯class是这样的:
class JobsAndHabits {
var name: String
var multiplier: Double
var assigned: String
var order: Int
init(jobName: String, jobMultiplier: Double, jobAssign: String, jobOrder: Int) {
self.name = jobName
self.multiplier = jobMultiplier
self.assigned = jobAssign
self.order = jobOrder
}
我解析 dictionary
的代码是这样的:
testing { (dictionary) in
for item in dictionary {
print(item)
let multiplier = dictionary["multiplier"] as! Double
let name = dictionary["name"] as! String
let assigned = dictionary["assigned"] as! String
let order = dictionary["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
}
print(self.dailyJobs)
我回来了:
[ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits]
每本词典4本。不知何故,我的代码将数组复制了 4 倍,现在我的头很痛。我确定有一个简单的解决方案。
我也试过了:
将所有代码放入原始闭包中,如下所示:
func loadExistingJobs(_ completion: @escaping () -> ()) {
ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String : Any] {
let multiplier = dictionary["multiplier"] as! Double
let name = dictionary["name"] as! String
let assigned = dictionary["assigned"] as! String
let order = dictionary["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
self.dailyJobs.sort(by: {[=17=].order < .order})
self.jobsTableView.reloadData()
completion()
}
})
但是 @escaping
闭包没有 运行 正确,我的后续代码没有得到执行。
TL;DR - 我想从 Firebase 中提取数据并将其附加到我的数组中。
请检查:
您的 dictionary
是 ["name": custom chore list, "multiplier": 1, "assigned": none, "order": 0]
并且您正在为此编写循环。它有 4 个键,所以它会循环 4 次。
如果您的字典类似于 [String: Any],那么您必须像下面这样调用:
testing { (dictionary) in
let multiplier = Double(dictionary["multiplier"] as! Int)
let name = dictionary["name"] as! String
let assigned = dictionary["assigned"] as! String
let order = dictionary["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
print(self.dailyJobs)
})
如果您的字典类似于 [[String: Any]],那么您必须像下面这样调用:
func testing(completion: @escaping ([[String : Any]]) -> ()) {
let dictionary = [[String: Any]]
ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
for child in (snapshot?.children)! {
let snap = child as! FDataSnapshot //each child is a snapshot
if let value = snap.value as? [String : Any] {
dictionary.append(value)
}
}
completion(dictionary)
})
}
testing { (dictionary) in
for item in dictionary {
print(item)
let multiplier = Double(item["multiplier"] as! Int)
let name = item["name"] as! String
let assigned = item["assigned"] as! String
let order = item["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
// }
print(self.dailyJobs)
}
})
嘿,你可以试试这个代码,然后根据你的需要修改
class JobsAndHabits {
var name: String
var multiplier: Double
var assigned: String
var order: Int
init(jobName: String, jobMultiplier: Double, jobAssign: String, jobOrder: Int) {
self.name = jobName
self.multiplier = jobMultiplier
self.assigned = jobAssign
self.order = jobOrder
}
class func getAllJobsAndHabbits(forUserID userID: String, completion: @escaping (JobsAndHabits) -> Swift.Void, failure: @escaping () -> ()) {
if Auth.auth().currentUser != nil {
Database.database().reference().child("jobsAndHabits").child(userID).observe(.childAdded, with: { (snapshot) in
if snapshot.exists() {
let receivedMessage = snapshot.value as! [String: Any]
let name = receivedMessage["content"] as? String ?? ""
let multiplier = receivedMessage["multiplier"] as? Double ?? 0.0
let assigned = receivedMessage["assigned"] as? String ?? ""
let order = receivedMessage["order"] as? Int ?? 0
completion(JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order))
} else {
failure()
}
})
} else {
failure()
}
}
}
调用和处理方式
class Test {
let dailyJobs:[JobsAndHabits] = []
JobsAndHabits.getAllJobsAndHabbits(forUserID: "12346", completion: {
self.dailyJobs.append(dailyJob)
self.dailyJobs.sort(by: {[=11=].order < .order})
}) {
//handle error
}
}
我已成功将我的 Firebase 数据提取到字典中,但我很难将值放入我的自定义 class。
要从 Firebase 获取数据,我使用以下代码:
func testing(completion: @escaping ([String : Any]) -> ()) {
ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
if let value = snapshot.value as? [String : Any] {
completion(value as [String : Any])
return
}
completion([:])
})
}
当我调用函数时
testing { (dictionary) in
print(dictionary)
}
我从 Firebase 取回的字典是这个(它是一个字典数组):
["name": custom chore list, "multiplier": 1, "assigned": none, "order": 0]
["name": bathrooms, "multiplier": 1, "assigned": none, "order": 1]
["name": laundry, "multiplier": 1, "assigned": none, "order": 2]
["name": living room, "multiplier": 1, "assigned": none, "order": 3]
["name": sweep & vacuum, "multiplier": 1, "assigned": sweep & vacuum, "order": 4]
["name": wipe table, "multiplier": 1, "assigned": none, "order": 5]
["name": counters, "multiplier": 1, "assigned": none, "order": 6]
["name": dishes, "multiplier": 1, "assigned": none, "order": 7]
["name": meal prep, "multiplier": 1, "assigned": none, "order": 8]
["name": feed pet / garbage, "multiplier": 1, "assigned": none, "order": 9]
我的习惯class是这样的:
class JobsAndHabits {
var name: String
var multiplier: Double
var assigned: String
var order: Int
init(jobName: String, jobMultiplier: Double, jobAssign: String, jobOrder: Int) {
self.name = jobName
self.multiplier = jobMultiplier
self.assigned = jobAssign
self.order = jobOrder
}
我解析 dictionary
的代码是这样的:
testing { (dictionary) in
for item in dictionary {
print(item)
let multiplier = dictionary["multiplier"] as! Double
let name = dictionary["name"] as! String
let assigned = dictionary["assigned"] as! String
let order = dictionary["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
}
print(self.dailyJobs)
我回来了:
[ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits]
每本词典4本。不知何故,我的代码将数组复制了 4 倍,现在我的头很痛。我确定有一个简单的解决方案。
我也试过了:
将所有代码放入原始闭包中,如下所示:
func loadExistingJobs(_ completion: @escaping () -> ()) {
ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String : Any] {
let multiplier = dictionary["multiplier"] as! Double
let name = dictionary["name"] as! String
let assigned = dictionary["assigned"] as! String
let order = dictionary["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
self.dailyJobs.sort(by: {[=17=].order < .order})
self.jobsTableView.reloadData()
completion()
}
})
但是 @escaping
闭包没有 运行 正确,我的后续代码没有得到执行。
TL;DR - 我想从 Firebase 中提取数据并将其附加到我的数组中。
请检查:
您的 dictionary
是 ["name": custom chore list, "multiplier": 1, "assigned": none, "order": 0]
并且您正在为此编写循环。它有 4 个键,所以它会循环 4 次。
如果您的字典类似于 [String: Any],那么您必须像下面这样调用:
testing { (dictionary) in
let multiplier = Double(dictionary["multiplier"] as! Int)
let name = dictionary["name"] as! String
let assigned = dictionary["assigned"] as! String
let order = dictionary["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
print(self.dailyJobs)
})
如果您的字典类似于 [[String: Any]],那么您必须像下面这样调用:
func testing(completion: @escaping ([[String : Any]]) -> ()) {
let dictionary = [[String: Any]]
ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
for child in (snapshot?.children)! {
let snap = child as! FDataSnapshot //each child is a snapshot
if let value = snap.value as? [String : Any] {
dictionary.append(value)
}
}
completion(dictionary)
})
}
testing { (dictionary) in
for item in dictionary {
print(item)
let multiplier = Double(item["multiplier"] as! Int)
let name = item["name"] as! String
let assigned = item["assigned"] as! String
let order = item["order"] as! Int
let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
self.dailyJobs.append(dailyJob)
// }
print(self.dailyJobs)
}
})
嘿,你可以试试这个代码,然后根据你的需要修改
class JobsAndHabits {
var name: String
var multiplier: Double
var assigned: String
var order: Int
init(jobName: String, jobMultiplier: Double, jobAssign: String, jobOrder: Int) {
self.name = jobName
self.multiplier = jobMultiplier
self.assigned = jobAssign
self.order = jobOrder
}
class func getAllJobsAndHabbits(forUserID userID: String, completion: @escaping (JobsAndHabits) -> Swift.Void, failure: @escaping () -> ()) {
if Auth.auth().currentUser != nil {
Database.database().reference().child("jobsAndHabits").child(userID).observe(.childAdded, with: { (snapshot) in
if snapshot.exists() {
let receivedMessage = snapshot.value as! [String: Any]
let name = receivedMessage["content"] as? String ?? ""
let multiplier = receivedMessage["multiplier"] as? Double ?? 0.0
let assigned = receivedMessage["assigned"] as? String ?? ""
let order = receivedMessage["order"] as? Int ?? 0
completion(JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order))
} else {
failure()
}
})
} else {
failure()
}
}
}
调用和处理方式
class Test {
let dailyJobs:[JobsAndHabits] = []
JobsAndHabits.getAllJobsAndHabbits(forUserID: "12346", completion: {
self.dailyJobs.append(dailyJob)
self.dailyJobs.sort(by: {[=11=].order < .order})
}) {
//handle error
}
}