2014-09-25 63 views
9

嵌套集合我有兩個類別:如何比較迅速

let collection1:[String:[String:NSObject]] = ["somekey":["nestedkey":"value"]] 

let collection2:[String:[String:NSObject]] = ["somekey":["nestedkey":"value"]] 

//I would like to compare them using the following: 

let collectionsAreEqual = collection1 == collection2 

複製和粘貼上面的代碼到操場提供了以下錯誤:

enter image description here

我知道我可以寫一個相同的功能:

infix func == (this:[String:[String:NSObject]], that:[String:[String:NSObject]]){ 
    //return true or false 
} 

在目標c中,isE qual:在NSDictionary中處理這個沒有問題,因爲它爲你做了嵌套比較。是否有一些方法可以快速處理這個問題?

更新

我可以使用以下命令:

//:[String:[String:NSObject]] 
let collection1:[String:NSObject] = ["somekey":["nestedkey":"value"]] 

let collection2:[String:NSObject] = ["somekey":["nestedkey":"value"]] 
//I would like to compare them using the following: 

let collectionsAreEqual = collection1 == collection2 

,但它需要使用NSObject的作爲在聲明中值。有沒有一種純粹的快速方法來處理這個問題?

+0

純Swift方法是編寫自定義運算符 - 適用於字典的唯一內置的== ==需要值爲「Equatable」,而這些字典和數組不是。儘管在某些條件下'=='可以用於數組和字典,但這並不意味着它們符合'Equatable'。 – 2014-09-26 17:51:27

回答

13

這裏有一個平等的運營商,將比較任意兩個嵌套的字典與同類型:

func ==<T: Equatable, K1: Hashable, K2: Hashable>(lhs: [K1: [K2: T]], rhs: [K1: [K2: T]]) -> Bool { 
    if lhs.count != rhs.count { return false } 

    for (key, lhsub) in lhs { 
     if let rhsub = rhs[key] { 
      if lhsub != rhsub { 
       return false 
      } 
     } else { 
      return false 
     } 
    } 

    return true 
} 
+0

按預期工作。 – Saltymule 2014-09-26 21:40:21

+0

我試圖在我的單元測試中使用它,它給了我一個錯誤:「連續的聲明必須用'分開';'」操作符超載在單元測試中不可用嗎? – 2015-01-09 15:40:03

+0

不應該是一個問題 - 函數在哪裏聲明?操作符函數必須位於頂層(在任何類或類型聲明之外)。 – 2015-01-09 15:44:52

0

試試這個:

let collection1:[String:NSObject] = ["somekey":["nestedkey":"value"]] 

let collection2:[String:NSObject] = ["somekey":["nestedkey":"value"]] 

let collectionsAreEqual = ((collection1 as NSDictionary).isEqual(collection2 as NSDictionary) 

通過鑄造迅速對象Foundation對象,他們得到了平等的運營商。他們會遞歸地在每個元素上調用平等運算符,因此您可以進行深入比較。