2017-07-31 52 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,而不是類和屬性觀察者。