嘿我正在使用didSet从字典中设置一个键数组,以便在我尝试访问数组以填充集合视图单元格时可以避免复制。当一个Cafe对象被改变但是当它没有被改变时,应该发生didSet。
private var _hashArray: [String]?
var hashArray: [String]? {
return _hashArray
}
var cafe: Cafe? {
didSet{
if let hashCounts = cafe?.hashtagCounts {
_hashArray = Array(hashCounts.keys)
}
}
}
...
RatingService.retrieveForCafe(yelpID: (cafe?.id)! , completion: { (tags) in
self.cafe?.hashtagCounts = tags
self.hashtagCollectionView.reloadData()
})
}
else {
print("is nil")
}
当我打印出标签时,它会正确打印字典及其键和值,但是当我尝试打印出hashArray或_hashArray时,它是零。你能让我知道我做错了吗?感谢
答案 0 :(得分:4)
当类的属性发生更改时,不会调用属性观察者。这是因为类是引用类型,即使它的属性可能发生变化,也不会分配新对象,因此不会触发属性观察者。
然而,结构是值类型,因此更改结构的属性会导致分配新对象来存储它。分配此新对象以替换当前的对象,以便属性观察者看到此更改并触发。如果使用let
而不是var
初始化结构,则会注意到您无法使用点表示法更改其任何属性。这是因为更改单个属性会“更改”整个对象(创建一个新对象)。
因此,将Cafe
更改为结构而不是类,并且在更改hashtagCounts
时应触发属性观察器。