设置是否未观察模型 属性 的变化 - Swift
Did set isn't observing model property's change - Swift
嘿,我正在使用 didSet 从字典中设置一个键数组,这样当我尝试访问该数组以填充集合视图单元格时就可以避免复制。 didSet 应该在 Cafe 对象发生更改时发生,但实际上没有发生。
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 时,它是零。你能告诉我我哪里做错了吗?谢谢
当 class 的 属性 改变时,属性 观察者不会被调用。这是因为 classes 是 引用类型 ,即使它的 属性 可能会改变,也不会分配新对象,因此 属性观察者未被触发。
但是,结构是 值类型,因此更改结构的 属性 会导致分配一个新对象来存储它。这个新对象被分配来替换当前对象,所以 属性 观察者看到这个变化并触发。如果您使用 let
而不是 var
初始化结构,您会注意到您无法使用点符号更改它的任何属性。这是因为更改单个 属性 "changes" 整个对象(创建一个新对象)。
因此,将 Cafe
更改为结构而不是 class,当 hashtagCounts
更改时应触发 属性 观察器。
嘿,我正在使用 didSet 从字典中设置一个键数组,这样当我尝试访问该数组以填充集合视图单元格时就可以避免复制。 didSet 应该在 Cafe 对象发生更改时发生,但实际上没有发生。
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 时,它是零。你能告诉我我哪里做错了吗?谢谢
属性 观察者不会被调用。这是因为 classes 是 引用类型 ,即使它的 属性 可能会改变,也不会分配新对象,因此 属性观察者未被触发。
但是,结构是 值类型,因此更改结构的 属性 会导致分配一个新对象来存储它。这个新对象被分配来替换当前对象,所以 属性 观察者看到这个变化并触发。如果您使用 let
而不是 var
初始化结构,您会注意到您无法使用点符号更改它的任何属性。这是因为更改单个 属性 "changes" 整个对象(创建一个新对象)。
因此,将 Cafe
更改为结构而不是 class,当 hashtagCounts
更改时应触发 属性 观察器。