Firebase 将DataSnapshot转换为自定义结构对象-Swift 4

Firebase 将DataSnapshot转换为自定义结构对象-Swift 4,firebase,firebase-realtime-database,swift4,Firebase,Firebase Realtime Database,Swift4,因此,在我的项目中,我创建了一个自定义结构: import Foundation import Firebase struct CheckedIn { let ref: DatabaseReference? let key: String let max_cm: String let max_in: String let weight_kg: Int let weight_lb: Int init(key: String = "",

因此,在我的项目中,我创建了一个自定义结构:

import Foundation
import Firebase

struct CheckedIn {

    let ref: DatabaseReference?
    let key: String
    let max_cm: String
    let max_in: String
    let weight_kg: Int
    let weight_lb: Int

    init(key: String = "", max_cm: String, max_in: String, weight_kg: Int, weight_lb: Int) {

        self.ref = nil
        self.key = key
        self.max_cm = max_cm
        self.max_in = max_in
        self.weight_kg = weight_kg
        self.weight_lb = weight_lb

    }

    init?(snapshot: DataSnapshot) {
        guard
            let value = snapshot.value as? [String: AnyObject],
            let max_cm = value["checked_max_cm"] as? String,
            let max_in = value["checked_max_in"] as? String,
            let weight_kg = value["checked_weight_kg"] as? Int,
            let weight_lb = value["checked_weight_in"] as? Int
        else {
            return nil
        }

        self.ref = snapshot.ref as DatabaseReference
        self.key = snapshot.key
        self.max_cm = max_cm
        self.max_in = max_in
        self.weight_kg = weight_kg
        self.weight_lb = weight_lb

    }

    func toAnyObject() -> Any {

        return [

            "checked_max_cm": self.max_cm,
            "checked_max_in": self.max_in,
            "checked_weight_kg": self.weight_kg,
            "checked_weight_in": self.weight_lb

        ]
    }
}
这是我的数据库的结构:

我尝试使用以下代码检索视图控制器中的一些数据:

ref.queryOrderedByKey().observe(.value) { (snapshot) in

    var newItems: [CheckedIn] = []

    for child in snapshot.children {

        print(child)

        if let snapshot = child as? DataSnapshot, let company = CheckedIn(snapshot: snapshot) {

            newItems.append(company)

        }

    }

    print(newItems)
    self.companiesCheckedIn = newItems
    self.tableView.reloadData()
    UIViewController.removeSpinner(spinner: sv)

}
问题是,每当我尝试打开视图控制器时(这段代码在.viewDidLoad中),列表“newItems”都是空的。奇怪的是当我试着跑的时候

印刷品(儿童)

所有的数据都打印出来了

所以我假设'if let snapshot=child as?DataSnapshot,let company=CarryOn(snapshot:snapshot)'块未运行,我该怎么办?

您的“已检查重量”和“已检查重量”是整数类型,但您指定了字符串类型

您的代码->

let weight_kg = value["checked_weight_kg"] as? String,
let weight_lb = value["checked_weight_in"] as? String 
改变->

init?(snapshot: DataSnapshot) {
        guard
            let value = snapshot.value as? [String: AnyObject],
            let max_cm = value["carry_max_cm"] as? String,
            let max_in = value["carry_max_in"] as? String,
            let weight_kg = value["checked_weight_kg"] as? Int,
            let weight_lb = value["checked_weight_in"] as? Int
            else {
                return nil
        }

        self.ref = snapshot.ref as DatabaseReference
        self.key = snapshot.key
        self.max_cm = max_cm
        self.max_in = max_in
        self.weight_kg = weight_kg
        self.weight_lb = weight_lb

    }

通过解决方法解决了问题:

此代码位于ViewController的
viewDidLoad()
方法之前

let ref = Database.database().reference().child("alldata")
var companyName: [String] = []
var maxCm: [String] = []
var maxIn: [String] = []
var weightKg: [Int] = []
var weightLb: [Int] = []
viewDidLoad()中

override func viewDidLoad(){
super.viewDidLoad()
中的ref.queryOrderedByKey().observeSingleEvent(of:.值){(快照)
让snapshotValue=snapshot.value为![String:[String:AnyObject]]
设sorted=snapshotValue.sorted(){$0.key.lowercased()<$1.key.lowercased()}
对于排序中的(键,x){
让关键点=快照值[关键点]
让公司名称=密钥
self.companyName.append(公司名称)
让我们将_max_cm=keys?[“keyname”]作为!字符串进行携带
self.maxCm.append(进位\u最大\u cm)
让\u max\u in=keys?[“keyname”]作为!字符串携带
self.maxIn.append(进位最大进位)
让我们携带重量=键?[“键名”]as!Int
自身重量kg.附加(携带重量kg)
让我们携带重量=键?[“键名”]as!Int
自身重量磅附加(携带重量磅)
}
self.tableView.reloadData()
}
}
let sorted=snapshotValue.sorted(){$0.key.lowercased()<$1.key.lowercased()}


按字母顺序排列词典

我已尝试按照您的建议更改代码,但结果与以前相同。我已经更新了问题@Sabbir AhmedIt中的代码,问题是“无法将“String”类型的值赋值给“Int”类型。哦,已经可以了。您将类型String更改为Int,这样就不需要了。那么我现在要做什么?问题一直存在,当我敲你的时候,我正试图解决这个问题
override func viewDidLoad() {
    super.viewDidLoad()

    ref.queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in

        let snapshotValue = snapshot.value as! [String:[String:AnyObject]]
        let sorted = snapshotValue.sorted() { $0.key.lowercased() < $1.key.lowercased() }

        for (key, _) in sorted {

            let keys = snapshotValue[key]
            let company_name = key
            self.companyName.append(company_name)
            let carry_max_cm = keys?["keyname"] as! String
            self.maxCm.append(carry_max_cm)
            let carry_max_in = keys?["keyname"] as! String
            self.maxIn.append(carry_max_in)
            let carry_weight_kg = keys?["keyname"] as! Int
            self.weightKg.append(carry_weight_kg)
            let carry_weight_lb = keys?["keyname"] as! Int
            self.weightLb.append(carry_weight_lb)

        }

        self.tableView.reloadData()

    }
}