我已将此作为雷达报告提交,但我不确定他们会做什么。
我拥有的是一个结构,该结构由类实例实例化和聚合。
由于 struct 是一个对象,因此它具有 setter 和 getter,以及 set/get 观察者。
我正在使用这些观察者重新索引结构实例的数组。
交易是,一个结构有一个“可见”标志(在我的实现中)。如果该标志被关闭(设置为 false),则容器类需要重新索引其所有结构,以从索引中删除现在不可见(或现在可见)的实例。
所以,最好的方法是,当我实例化一个结构实例时,我将一个对容器实例的引用传递给它,并设置一个 didSet { myContainer.reIndex() } 处理程序。
问题是结构和类的行为似乎不同。我怀疑这是一个价值/参考问题。
在一个类中,实例的外部值是在调用 didSet 时设置的。这意味着我可以调用一个外部对象来重新索引,它会看到新的值。
在结构中,直到执行 didSet 之后才出现这种情况。
我将在 RADAR 报告中包含我提交的游乐场。
我的问题是:你认为结构应该有 setter/getter 观察者吗?他们应该有setter/getter吗?
我确实有一个解决方法。我在更改值后调用索引器。它只是没有那么优雅。
操场(在下面的代码中,查看在 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()