struct和class didSet过程表现不同

时间:2014-08-18 15:41:36

标签: class swift struct reference didset

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

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

由于struct是一个对象,它有setter和getter,以及set / get观察者。

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

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

所以,最好的方法是,当我实例化一个struct实例时,我将它提交给容器实例,并设置一个didSet {myContainer.reIndex()}处理程序。

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

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

在结构中,直到执行didSet之后才会出现这种情况。

我将包含我使用RADAR报告提交的游乐场。

我的问题是:你认为结构应该有setter / getter观察者吗?他们应该有制定者/吸气者吗?

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

playground(在下面的代码中,查看didSet处理程序期间发出的不同值):

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()

0 个答案:

没有答案