属性设置器在交换机中调用而不是getter(Xcode 9.3& 9.4)

时间:2018-06-06 17:20:03

标签: swift realm xcode9.3 xcode9.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中的一些更改或者是什么。

2 个答案:

答案 0 :(得分:0)

不确定哪里出错了¹但是在同一个班级中有一个读/写var type和一个单独的属性setType听起来真的很可疑。尝试将setType重命名为rawSetType,以确保它不会与type属性发生冲突。

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

答案 1 :(得分:0)

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