Swift 在交换机(Xcode 9.3和9.4)中调用属性设置程序而不是getter
考虑以下对象:Swift 在交换机(Xcode 9.3和9.4)中调用属性设置程序而不是getter,swift,realm,xcode9.3,xcode9.4,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
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
}
}
enum SetType:String{
等轴测病例
}
类RealmSet:Object{
@objc动态私有变量setType:String=“”
变量类型:SetType{
得到{
guard let unwrappedSetType=SetType(原始值:SetType)else{
回流厌氧
}
返回未包装的设置类型
}
设置{
self.setType=newValue.rawValue
}
}
}
协议练习集{
var setType:setType{get}
}
课堂练习:对象{
私有let setsValues=List()
变量集:[ExerciseSet]{
变量集=[ExerciseSet]()
对于self.setsValues中的setValue{
开关setValue.type{
案例.厌氧:
//做点什么
例.等距图:
//做点什么
}
}
返回集
}
}
发生的情况是,当我尝试迭代这个setsValues
数组并执行开关
以发现哪种类型的RealmSet
,而不是调用RealmSet
中的type
getter属性时,会调用setter。由于这个对象是一个领域对象,应用程序会立即崩溃,因为我没有运行写事务,这是正确的,因为我只需要访问属性getter,而不需要访问它的setter
这种情况最奇怪的是,当Xcode版本低于9.3时,这种情况就不会发生。这只发生在Xcode 9.3和9.4中。当我使用Xcode 9.2时,一切工作都很完美
我不知道问题出在哪里。如果是Realm lib,那么Xcode 9.3和9.4版中的一些更改或是什么。不确定到底哪里出了问题,但是在同一个类中有一个读/写
var类型和一个单独的属性setType
,这听起来让我非常怀疑。尝试将setType
重命名为类似于rawSetType
的名称,至少确保它不会与type
属性冲突
1必须与领域相关。Object
是Objective-C类,这意味着对于type
属性,将有一个名为setType
的setter。对于那些面临相同问题的人,在处理领域时不要使用get set
。领域通过KVO访问属性,因此在某些情况下它会丢失并导致此类错误。使用get only
properties和函数组合来设置此属性,而不是使用get set
您确定不是开关
语句的主体案例导致崩溃吗?您是否只在case
语句中打印了一些内容,以确保您没有意外地修改其中的任何内容?@DávidPásztor是的。我还在RealmSet
type
属性的getter
和setter
中设置了一个断点,当开关执行时,它到达setter断点。我也为XCode 9.2做了这项工作,但是在这个版本中,getter被调用。我试图重现您的问题,但是当它是私有的时,您应该如何向Exercise.setsValues
添加值sets
是一个访问setsValues
的计算属性,因此我似乎找不到一种方法来向其中任何一个添加值,从而触发错误。@DávidPásztorsetsValues
是一个私有属性,因为您不应该在模型之外更改其值。这就是我创建此计算属性集的原因,因为它管理对此列表属性的访问和修改。由于这两个(setvalues
和sets
)属于同一类,我看不出由于私人保护而无法访问的任何原因。我的意思是,如果不显示如何从sets
内部修改setvalues
,则很难重现您的问题。您应该修改问题中的代码以包含。我已重命名所有这些变量,以确保不存在名称冲突,并且与变量名称无关。