ios - 设置是否没有观察模型属性的变化 - Swift

标签 ios arrays swift nsdictionary didset

<分区>

嘿,我正在使用 didSet 从字典中设置一个键数组,这样当我尝试访问该数组以填充 Collection View 单元格时,我就可以避免复制。 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 时,它是零。你能告诉我我哪里做错了吗?谢谢

最佳答案

当一个类的属性改变时,不会调用属性观察器。这是因为类是引用类型,即使它的属性可能发生变化,也不会分配新对象,因此不会触发属性观察器。

但是,结构是值类型,因此更改结构的属性会导致分配一个新对象来存储它。这个新对象被分配来替换当前对象,以便属性观察者看到这个变化并触发。如果您使用 let 而不是 var 初始化结构,您会注意到您无法使用点符号更改它的任何属性。这是因为更改单个属性会“更改”整个对象(创建一个新对象)。

因此,将 Cafe 更改为结构而不是类,并且当 hashtagCounts 更改时应触发属性观察器。

关于ios - 设置是否没有观察模型属性的变化 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45422286/

相关文章:

ios - 如何使用 swift 解决 ViewController 之间的 segue 问题?

ios - 截断单词末尾的渐变淡出

ios - 将 NSData 添加到 NSDirectory (JSON) 中,在 JSON 写入 (NSConcreteMutableData) 错误中出现无效类型

java - java中的数组是如何实现的?

ios - 使用 Collectionview 在自定义单元格上使用协议(protocol)重新加载数据?

ios - .reloadData() 和 .setNeedsDisplay() 被忽略

swift - ios9 缓存 NSData?

ios - 获取 SKPhysicsBody 以在纹理动画时更新 (Swift)

java - 将具有 Integer 元素的对象数组分配给 Integer 数组

java - LeetCode 的二和问题 : Brute force solution approach not working?