Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在交换机(Xcode 9.3和9.4)中调用属性设置程序而不是getter_Swift_Realm_Xcode9.3_Xcode9.4 - Fatal编程技术网

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ásztor
setsValues
是一个私有属性,因为您不应该在模型之外更改其值。这就是我创建此计算属性集的原因,因为它管理对此列表属性的访问和修改。由于这两个(
setvalues
sets
)属于同一类,我看不出由于私人保护而无法访问的任何原因。我的意思是,如果不显示如何从
sets
内部修改
setvalues
,则很难重现您的问题。您应该修改问题中的代码以包含。我已重命名所有这些变量,以确保不存在名称冲突,并且与变量名称无关。