为结构添加了属性,在Swift中,该属性使现有对象无效。

问题描述 投票:0回答:1

我是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!
        ]
    }
}
swift firebase optional
1个回答
1
投票

有问题的一点是你的initable失败。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 值。只需将它们保持为 Optional不需要任何拆包和添加 as Any 以消弭隐性胁制的警示。

func toAnyObject() -> Any {
    return [
        "name": name,
        "timestamp": timestamp,
        "itemValue": itemValue,
        "description": description as Any,
        "userId": userId as Any
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.