在 Swift 中添加了 属性 结构 - 使现有对象无效

Added property to struct which in Swift - invalidates existing objects

我是 Swift 的新手,但对 Objective-C 编程有一些基本的经验,而且 Swift 似乎更简单。

不过,struct这个东西我不是很明白。我遵循了有关如何使用 Firebase 实时数据库的教程,并且本教程使用模型来存储数据。

但是当我用附加属性修改 struct 时,以前保存在数据库中的条目没有显示出来。我认为这是因为模型无法识别数据库中的对象,因为它具有不同的属性,但是我怎样才能使 属性 可选?这样数据库中具有不同结构(缺少属性)的旧条目仍然有效并显示出来?

这是模型。添加的新 属性 是对 description 的所有引用。

import Foundation
import Firebase

struct InsuranceItem {

    let ref: DatabaseReference?
    let key: String
    let name: String
    let timestamp: Int
    let itemValue: Int
    let description: String?
    let userId: String?

    init(name: String, timestamp: Int, itemValue: Int = 0, description: String = "", userId: String, key: String = "") {
        self.ref = nil
        self.key = key
        self.name = name
        self.timestamp = Int(Date().timeIntervalSince1970)
        self.itemValue = itemValue
        self.description = description
        self.userId = userId
    }

    init?(snapshot: DataSnapshot) {
        guard
            let value = snapshot.value as? [String: AnyObject],
            let name = value["name"] as? String,
            let timestamp = value["timestamp"] as? Int,
            let itemValue = value["itemValue"] as? Int,
            let description = value["description"] as? String,
            let userId = value["userId"] as? String else { return nil }

        self.ref = snapshot.ref
        self.key = snapshot.key
        self.name = name
        self.timestamp = timestamp
        self.itemValue = itemValue
        self.description = description
        self.userId = userId
    }

    func toAnyObject() -> Any {
        return [
            "name": name,
            "timestamp": timestamp,
            "itemValue": itemValue,
            "description": description!,
            "userId": userId!
        ]
    }
}

有问题的是你的失败初始化,init?(snapshot: DataSnapshot)。即使 Optional 属性 缺失,您的初始化也会失败,这是不正确的。您应该只在 guard 语句中包含非可选属性,所有其他属性都应该简单地分配可选的强制转换值。

init?(snapshot: DataSnapshot) {
    guard
        let value = snapshot.value as? [String: Any],
        let name = value["name"] as? String,
        let timestamp = value["timestamp"] as? Int,
        let itemValue = value["itemValue"] as? Int else { return nil }

    self.ref = snapshot.ref
    self.key = snapshot.key
    self.name = name
    self.timestamp = timestamp
    self.itemValue = itemValue

    // Optional properties
    let description = value["description"] as? String
    let userId = value["userId"] as? String
    self.description = description
    self.userId = userId
}

与您的问题无关,但是您的 toAnyObject 函数不安全,因为您正在强制展开 Optional 值。只需将它们保持为 Optionals 而不进行任何展开,并添加 as Any 以消除隐式强制转换的警告。

func toAnyObject() -> Any {
    return [
        "name": name,
        "timestamp": timestamp,
        "itemValue": itemValue,
        "description": description as Any,
        "userId": userId as Any
    ]
}