属性 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
考虑以下对象:
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