1

嘿,我正在使用 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 时,它是 nil。你能告诉我我哪里做错了吗?谢谢

4

1 回答 1

7

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

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

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

于 2017-07-31T18:12:13.217 回答