【问题标题】:Swift Firebase cannot store values in dictionarySwift Firebase 无法将值存储在字典中
【发布时间】:2020-11-02 15:04:28
【问题描述】:

我陷入了僵局。

我有一些评级值的数据模型,我想检索这些评级值,然后用于一些计算。这些值存储为字符串,即使它们是介于 -9 和 9 之间的数字。这里的转换不是问题。

import FirebaseDatabase.FIRDataSnapshot

class AHPPriority {
    
    var key: String?
    
    let creationDate: Date
    let ajkpXc: String
    let ajkpXijr: String
    let ajkpXqpa: String
    let ajkpXcoj: String
    let ajkpXlos: String
    let ajkpXiracc: String
    let ajkpXdph: String
    let cXijr: String
    let cXqpa: String
    let cXcoj: String
    let cXlos: String
    let cXiracc: String
    let cXdph: String
    let ijrXqpa: String
    let ijrXcoj: String
    let ijrXlos: String
    let ijrXiracc: String
    let ijrXdph: String
    let qpaXcoj: String
    let qpaXlos: String
    let qpaXiracc: String
    let qpaXdph: String
    let cojXlos: String
    let cojXiracc: String
    let cojXdph: String
    let losXiracc: String
    let losXdph: String
    let iraccXdph: String

    
    init(ajkpXc: String, ajkpXijr: String, ajkpXqpa: String, ajkpXcoj: String, ajkpXlos: String, ajkpXiracc: String, ajkpXdph: String, cXijr: String, cXqpa: String, cXcoj: String, cXlos: String, cXiracc: String, cXdph: String, ijrXqpa: String, ijrXcoj: String, ijrXlos: String, ijrXiracc: String, ijrXdph: String, qpaXcoj: String,  qpaXlos: String,   qpaXiracc: String,  qpaXdph: String, cojXlos: String, cojXiracc: String, cojXdph: String, losXiracc: String, losXdph: String, iraccXdph: String) {
        
                self.creationDate = Date()
                self.ajkpXc = ajkpXc
                self.ajkpXijr = ajkpXijr
                self.ajkpXqpa = ajkpXqpa
                self.ajkpXcoj = ajkpXcoj
                self.ajkpXlos = ajkpXlos
                self.ajkpXiracc = ajkpXiracc
                self.ajkpXdph = ajkpXdph
                self.cXijr = cXijr
                self.cXqpa = cXqpa
                self.cXcoj = cXcoj
                self.cXlos = cXlos
                self.cXiracc = cXiracc
                self.cXdph = cXdph
                self.ijrXqpa = ijrXqpa
                self.ijrXcoj = ijrXcoj
                self.ijrXlos = ijrXlos
                self.ijrXiracc = ijrXiracc
                self.ijrXdph =  ijrXdph
                self.qpaXcoj = qpaXcoj
                self.qpaXlos = qpaXlos
                self.qpaXiracc = qpaXiracc
                self.qpaXdph = qpaXdph
                self.cojXlos = cojXlos
                self.cojXiracc = cojXiracc
                self.cojXdph = cojXdph
                self.losXiracc = losXiracc
                self.losXdph = losXdph
                self.iraccXdph = iraccXdph
        
        
    }

    var dictValue: [String: Any] {
   let createdAgo = creationDate.timeIntervalSince1970
    
        return ["created_at" : createdAgo,
        "ajkpXc": ajkpXc,
        "ajkpXijr ": ajkpXijr,
        "ajkpXqpa": ajkpXqpa,
        "ajkpXcoj": ajkpXcoj,
        "ajkpXlos ": ajkpXlos,
        "ajkpXiracc ": ajkpXiracc,
        "ajkpXdph": ajkpXdph,
        "cXijr": cXijr,
        "cXqpa": cXqpa,
        "cXcoj": cXcoj,
        "cXlos": cXlos,
        "cXiracc": cXiracc,
        "cXdph": cXdph,
        "ijrXqpa": ijrXqpa,
        "ijrXcoj": ijrXcoj,
        "ijrXlos": ijrXlos,
        "ijrXiracc": ijrXiracc,
        "ijrXdph": ijrXdph,
        "qpaXcoj": qpaXcoj,
        "qpaXlos": qpaXlos,
        "qpaXiracc": qpaXiracc,
        "qpaXdph": qpaXdph,
        "cojXlos": cojXlos,
        "cojXiracc": cojXiracc,
        "cojXdph": cojXdph,
        "losXiracc": losXiracc,
        "losXdph": losXdph,
        "iraccXdph": iraccXdph ]
     
}
    
    init?(snapshot: DataSnapshot) {
    guard let dict = snapshot.value as? [String: Any],
    
    let createdAgo = dict["created_at"] as? TimeInterval,
    let ajkpXc = dict["ajkpXc"] as? String,
    let ajkpXijr = dict["ajkpXijr"] as? String,
    let ajkpXqpa = dict["ajkpXqpa"] as? String,
    let ajkpXcoj = dict["ajkpXcoj"] as? String,
    let ajkpXlos = dict["ajkpXlos"] as? String,
    let ajkpXiracc = dict["ajkpXiracc"] as? String,
    let ajkpXdph = dict["ajkpXdph"] as? String,
    let cXijr = dict["cXijr"] as? String,
    let cXqpa = dict["cXqpa"] as? String,
    let cXcoj = dict["cXcoj"] as? String,
    let cXlos = dict["cXlos"] as? String,
    let cXiracc = dict["cXiracc"] as? String,
    let cXdph = dict["cXdph"] as? String,
    let ijrXqpa = dict["ijrXqpa"] as? String,
    let ijrXcoj = dict["ijrXcoj"] as? String,
    let ijrXlos = dict["ijrXlos"] as? String,
    let ijrXiracc = dict["ijrXiracc"] as? String,
    let ijrXdph = dict["ijrXdph"] as? String,
    let qpaXcoj = dict["qpaXcoj"] as? String,
    let qpaXlos = dict["qpaXlos"] as? String,
    let qpaXiracc = dict["qpaXiracc"] as? String,
    let qpaXdph = dict["qpaXdph"] as? String,
    let cojXlos = dict["cojXlos"] as? String,
    let cojXiracc = dict["cojXiracc"] as? String,
    let cojXdph = dict["cojXdph"] as? String,
    let losXiracc = dict["losXiracc"] as? String,
    let losXdph = dict["losXdph"] as? String,
    let iraccXdph = dict["iraccXdph"] as? String

     else {return nil}
        
        
        self.key = snapshot.key
        self.creationDate = Date(timeIntervalSince1970: createdAgo)
        self.ajkpXc = ajkpXc
        self.ajkpXijr = ajkpXijr
        self.ajkpXqpa = ajkpXqpa
        self.ajkpXcoj = ajkpXcoj
        self.ajkpXlos = ajkpXlos
        self.ajkpXiracc = ajkpXiracc
        self.ajkpXdph = ajkpXdph
        self.cXijr = cXijr
        self.cXqpa = cXqpa
        self.cXcoj = cXcoj
        self.cXlos = cXlos
        self.cXiracc = cXiracc
        self.cXdph =  cXdph
        self.ijrXqpa = ijrXqpa
        self.ijrXcoj = ijrXcoj
        self.ijrXlos = ijrXlos
        self.ijrXiracc =  ijrXiracc
        self.ijrXdph =  ijrXdph
        self.qpaXcoj = qpaXcoj
        self.qpaXlos = qpaXlos
        self.qpaXiracc =   qpaXiracc
        self.qpaXdph = qpaXdph
        self.cojXlos = cojXlos
        self.cojXiracc = cojXiracc
        self.cojXdph = cojXdph
        self.losXiracc =   losXiracc
        self.losXdph = losXdph
        self.iraccXdph = iraccXdph
        }

}

我实际上可以使用以下服务正确检索数据:

struct UserService {
    static func ahpPref(for user: User, completion: @escaping ([AHPPriority]) -> Void) {
           let ref = Database.database().reference().child("AHPRatings").child(user.uid)
        
        ref.observe(DataEventType.value, with: { (snapshot) in
                   guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
                       return completion([])
                   }

                   let ahpPrios = snapshot.reversed().compactMap(AHPPriority.init)
                   completion(ahpPrios)
                print( ahpPrios)
            for ahpPrio in ahpPrios {
                print(ahpPrio)
            }
               })

        
     
    }
}

奇怪的是,快照包含所有值。但是 ahpPrios 是空的。我不知道为什么。

谁能帮帮我? :)

【问题讨论】:

    标签: swift database firebase dictionary


    【解决方案1】:

    您正在为 AHPPriority 使用可失败的初始化程序 (init?),并结合 compactMap 如果所有初始化程序都失败,则将返回空数组。要解决此问题,您必须完全修改 init?(snapshot: DataSnapshot) 方法。检查返回nil 的每个值,而不是初始化失败,可以提供默认值或仅将该属性设为可选。例如,如果created_at 返回为nil 并且init 完全失败,则将creationDate 设为可选let creationDate: Date?。删除包含所有内容的guard let,并根据您的要求进行故障保护guard let

    更好的方法是使用Codable

    【讨论】:

    • 这是一个很好的答案,非常感谢你!但我绝对是个菜鸟,我从 youtube 教程中获得的所有知识:D 你认为你可以为我提出一个好的代码示例吗?如果工作量太大,我会自己尝试...无论如何,非常感谢!我从来没有想过!
    • 对完成特定任务的最佳实践进行更多研究。 Youtube 对初学者来说是很好的资源,也许多挖一点,找到更多有用的频道。继续编码,祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2017-10-28
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多