属性 setter 在 switch 中调用而不是 getter (Xcode 9.3 & 9.4)

Property setter called instead of getter in switch (Xcode 9.3 & 9.4)

考虑以下对象:

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 数组并执行 switch 来发现 RealmSet 的类型时,而不是 type getter 属性 来自 RealmSet 被调用,setter 被调用。由于这个对象是一个 Realm 对象,应用程序立即崩溃,因为我不是 运行 写事务,这是真的,因为我只需要访问 属性 getter,而不是它的 setter.

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

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

不确定到底哪里出了问题¹但是在同一个 class 中有一个 read/write var type 和一个单独的 属性 setType 听起来真的很可疑我。尝试将 setType 重命名为 rawSetType 之类的名称,以至少确保它不会与 type 属性.

冲突

¹ 必须与 Realm.Object 相关,成为 Objective-C class,这意味着对于 type 属性 会有 setter名为 setType.

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