-1

考虑以下对象:

enum SetType: String {
    case anaerobic, isometric
}

class RealmSet: Object {
   @objc dynamic private var setType: String = ""
    var type: SetType {
        get {
            guard let unwrappedSetType = SetType(rawValue: setType) else {
                return .anaerobic
            }
            return unwrappedSetType
        }
        set {
            self.setType = newValue.rawValue
        }
    }
}

protocol ExerciseSet {
    var setType: SetType { get }
}

class Exercise: Object {
   private let setsValues = List<RealmSet>()
   var sets: [ExerciseSet] {
        var sets = [ExerciseSet]()
        for setValue in self.setsValues {
            switch setValue.type {
            case .anaerobic:
                // Do Something

            case .isometric:
                // Do Something
            }
        }

        return sets
    }
}

发生的情况是,当我尝试迭代这个数组setsValues并执行 aswitch以发现哪种是 that RealmSet,而不是typegetter 属性 fromRealmSet被调用时,setter 被调用。由于这个对象是一个 Realm 对象,应用程序会立即崩溃,因为我没有运行写事务,这是真的,因为我只需要访问属性 getter,而不是它的 setter。

这种情况最奇怪的是当 Xcode 版本低于 9.3 时不会发生这种情况。这只发生在 Xcode 9.3 和 9.4 中。当我使用 Xcode 9.2 时,一切正常。

我不知道问题出在哪里。如果是 Realm lib,Xcode 版本 9.3 和 9.4 或什么的一些变化。

4

2 回答 2

0

不确定到底哪里出了问题¹,但是在同一个类中拥有读/写var type和单独的属性setType对我来说真的很可疑。尝试重命名setTyperawSetType至少确保它不会与type属性冲突。

¹ 必须与Realm.Object作为一个 Objective-C 类相关,这意味着对于type属性,会有一个名为setType.

于 2018-06-06T18:47:34.820 回答
0

get set对于那些面临同样问题的人,在使用Realm 处理时不要使用。Realm 通过 KVO 访问属性,因此在某些情况下它会丢失并导致这种错误。使用get-only与函数结合的属性来设置此属性,而不是使用get set

于 2018-11-05T14:39:27.020 回答