set没有观察到模型属性的变化--Swift

时间:2017-07-31 17:50:21

标签: ios arrays swift nsdictionary didset

嘿我正在使用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时,它是零。你能让我知道我做错了吗?感谢

1 个答案:

答案 0 :(得分:4)

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

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

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