2017-07-31 9 views
1

ちょっと私はdidSetを使って辞書からキーの配列を設定して、配列にアクセスしてコレクションビューのセルを設定しようとすると、 didSetは、Cafeオブジェクトが変更されたときに発生すると想定されますが、変更されていないときに発生します。モデルのプロパティの変更を監視していませんでしたか?Swift

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

'Cafe'は構造体かクラスですか? – Paolo

+0

カフェはクラスです – Sam

答えて

4

プロパティオブザーバは、クラスのプロパティが変更されたときに呼び出されません。これは、クラスがの参照タイプであり、そのプロパティが変更されても新しいオブジェクトが割り当てられないためプロパティオブザーバがトリガされないためです。

構造体は、の値型であるため、構造体のプロパティを変更すると、新しいオブジェクトが割り当てられて格納されます。この新しいオブジェクトは、現在のオブジェクトを置き換えるように割り当てられているので、プロパティオブザーバはこの変更を認識して起動します。 varの代わりにletで構造体を初期化すると、ドット表記でプロパティのプロパティを変更できないことがわかります。これは、単一のプロパティを変更すると、オブジェクト全体が変更される(新しいオブジェクトが作成される)ためです。

したがって、クラスではなく構造体にを変更し、hashtagCountsが変更されたときにプロパティオブザーバをトリガする必要があります。

関連する問題