Ios 是否设置了isn';t观察模型属性';s change-Swift

Ios 是否设置了isn';t观察模型属性';s change-Swift,ios,arrays,swift,nsdictionary,didset,Ios,Arrays,Swift,Nsdictionary,Didset,嘿,我正在使用didSet从字典中设置一个键数组,这样当我试图访问数组以填充集合视图单元格时,可以避免复制。didSet应该在Cafe对象发生更改时发生,但实际情况并非如此 private var _hashArray: [String]? var hashArray: [String]? { return _hashArray } var cafe: Cafe? { didSet{ if let hashCounts = cafe?.hashtagCount

嘿,我正在使用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)
        }
    }
}


当我打印出标记时,它会正确地打印出字典及其键和值,但当我尝试打印hashArray或_hashArray时,它是零。你能告诉我哪里做错了吗?谢谢

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

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


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

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

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


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

Cafe
结构还是类?Cafe是classIs
Cafe
结构还是类?Cafe是类
RatingService.retrieveForCafe(yelpID: (cafe?.id)! , completion: { (tags) in
            self.cafe?.hashtagCounts = tags
            self.hashtagCollectionView.reloadData()

        })
    }
    else {
        print("is nil")
    }