2017-07-31 24 views
1

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

+0

“咖啡厅”是一个结构还是一个类? – Paolo

+0

咖啡厅是一个类 – Sam

回答

4

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

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

因此,当hashtagCounts改变应触发改变Cafe一个struct,而不是类和属性观察者。