设置是否未观察模型 属性 的变化 - 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 更改时应触发 属性 观察器。