Class 结构和类didSet过程的行为不同

Class 结构和类didSet过程的行为不同,class,swift,struct,reference,didset,Class,Swift,Struct,Reference,Didset,我已经将此作为雷达报告提交,但我不确定他们会怎么做 我拥有的是一个结构,该结构由一个类实例实例化和聚合 因为结构是一个对象,所以它有setter和getter,以及set/get观察器 我正在使用这些观察者对结构实例数组重新编制索引 关键是,结构有一个“可见”标志(在我的实现中)。如果关闭该标志(设置为false),则容器类需要重新索引其所有结构,以从索引中删除现在不可见(或现在可见)的实例 因此,最好的方法是,当我实例化一个结构实例时,我给它一个对容器实例的引用,并设置一个didSet{myC

我已经将此作为雷达报告提交,但我不确定他们会怎么做

我拥有的是一个结构,该结构由一个类实例实例化和聚合

因为结构是一个对象,所以它有setter和getter,以及set/get观察器

我正在使用这些观察者对结构实例数组重新编制索引

关键是,结构有一个“可见”标志(在我的实现中)。如果关闭该标志(设置为false),则容器类需要重新索引其所有结构,以从索引中删除现在不可见(或现在可见)的实例

因此,最好的方法是,当我实例化一个结构实例时,我给它一个对容器实例的引用,并设置一个didSet{myContainer.reIndex()}处理程序

问题是结构和类的行为似乎不同。我怀疑这是一个价值/参考问题

在类中,实例的外部值在调用didSet时设置。这意味着我可以调用一个外部对象来重新编制索引,它将看到新的值

在结构中,在执行didSet之前,情况似乎并非如此

我将包括我随雷达报告提交的游乐场

我的问题是:你认为结构应该有setter/getter观察器吗?他们应该有二传手/接球手吗

我确实有一个解决办法。我在更改值后调用索引器。只是没有那么优雅

操场(在下面的代码中,请参见didSet处理程序期间发出的不同值):


好吧,也许是显而易见的,但我同意,它看起来像是结构处理中的一个bug
oldValue
似乎设置正确,但新值(根据规范)应该在调用didSet之前设置。我同意,但我有一种不愉快的感觉,苹果将通过从结构中删除setter和getter来响应。斯威夫特是一个快速移动的目标。每个测试版都会带来相当大的语言变化。@将来请不要在你的问题标题中添加标记,例如“Swift:…question…”等。这被认为是噪音,因为当你已经添加了语言标记时,它不会帮助人们搜索。完成。此外,仅供参考,该问题是一份封闭雷达报告(18048502)。已经分类了。
struct StructA
{
    let classBInstance:ClassB

    init ( inClassB:ClassB )
    {
        self.classBInstance = inClassB
        self.testProperty = 0
    }

    var testProperty:Int = -1
    {
        didSet
        {
            self.classBInstance.reactToSetStruct ( )
        }
    }
}

class ClassA
{
    let classBInstance:ClassB

    init ( inClassB:ClassB )
    {
        self.classBInstance = inClassB
        self.testProperty = 0
    }

    var testProperty:Int = -1
    {
        didSet
        {
            self.classBInstance.reactToSetClass ( )
        }
    }
}

class ClassB
{
    var structAInstance:StructA! = nil
    var classAInstance:ClassA! = nil

    init()
    {
        self.structAInstance = StructA ( inClassB:self )
        self.classAInstance = ClassA ( inClassB:self )
    }

    func doSetStruct()
    {
        println ("Before Set: Struct Property Value is \(self.structAInstance.testProperty)")
        self.structAInstance.testProperty = 1
        println ("After Set: Struct Property Value is \(self.structAInstance.testProperty)")
    }

    func doSetClass()
    {
        println ("Before Set: Class Property Value is \(self.classAInstance.testProperty)")
        self.classAInstance.testProperty = 1
        println ("After Set: Class Property Value is \(self.classAInstance.testProperty)")
    }

    func reactToSetStruct()
    {
        println ("Struct Value is now \(self.structAInstance.testProperty)")
    }

    func reactToSetClass()
    {
        println ("Class Value is now \(self.classAInstance.testProperty)")
    }
}

let classTest:ClassB = ClassB()

classTest.doSetStruct()
classTest.doSetClass()