考虑以下对象:
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中的一些更改或者是什么。
答案 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