【问题标题】:Swift: Bug when try to access value of object in arraySwift:尝试访问数组中对象的值时出现错误
【发布时间】:2018-09-25 14:08:13
【问题描述】:

我遇到了一个非常奇怪的错误,我有一个 PodEvent 类型的数组,并且使用第二个函数我得到了另一个我要转换的数组,当我打印转换后的数组时,它会显示所有对象板...

      PodEvent {
    eventID = 2;
    podID = 1;
    drinkDate = 2018-09-25 10:00:00 +0000;
    actualDrinkingTime = (null);
    keyDate = 2018-09-25 13:00;
    rawState = Forgotten;
}

但是当我想访问对象的值时,它会作为默认值返回给我!例如:

print(self.podEvents[1].eventID)
print(self.podEvents[1].podID)

输出:

-1
-1

这是我的课:

class PodEvent: Object {
@objc var eventID: Int = -1
@objc var podID: Int = -1
@objc var drinkDate: Date = Date()
@objc var actualDrinkingTime: Date? = Date()
var state: PodState = .future
@objc var keyDate: String = ""
@objc private var rawState: String!

convenience init(eventID: Int, podID: Int, drinkDate: Date, actualDrinkingTime: Date?, state: PodState){
    self.init()
    self.eventID = eventID
    self.podID = podID
    self.drinkDate = drinkDate
    self.actualDrinkingTime = actualDrinkingTime
    self.state = state
    self.rawState = state.state
}

func setState(state: PodState){
    self.state = state
    rawState = state.state
}

override class func primaryKey() -> String? {
    return "keyDate"
}

这个bug很奇怪

获取数组的代码:

//Fetch pod history in internal database
            self.databaseManager.fetch(object: PodEvent.self, predicate: nil, sortedBy: "keyDate", ascending: true) { success, results, error in
                guard error == nil else {
                    Alerts.alertMessage(for: self, title: "ERROR".localized,
                        message: error!.localizedDescription,
                        closeHandler: nil)
                    return
                }

                self.podEvents = (results as! [PodEvent])
                self.pods = pods
                print(self.podEvents[1].eventID)
                print(self.podEvents[1].podID)
            }

和:

func fetch(object: Object.Type, predicate: NSPredicate?, sortedBy: String, ascending: Bool, completion: DatabaseCompletion?) {
    do {
        let realm = try Realm()

        let objects: Results<Object>!

        if let predicate = predicate {
            objects = realm.objects(object).filter(predicate).sorted(byKeyPath: sortedBy, ascending: ascending)
        } else {
            objects = realm.objects(object).sorted(byKeyPath: sortedBy, ascending: ascending)
        }

        let objectsArray = Array(objects)
        completion?(true, objectsArray, nil)
    } catch let error {
        print("Could not write object (type \(object)) to Realm:", error.localizedDescription)
        completion?(false, nil, error)
    }
}

我正在使用领域

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    您的对象定义有缺陷,您需要将dynamic 关键字添加到所有持久化属性中。

    class PodEvent: Object {
        @objc dynamic var eventID = -1
        @objc dynamic var podID = -1
        @objc dynamic var drinkDate = Date()
        @objc dynamic var actualDrinkingTime: Date? = Date()
        var state: PodState = .future
        @objc dynamic var keyDate = ""
        @objc dynamic private var rawState: String!
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 2017-10-08
      相关资源
      最近更新 更多