2015-11-06 107 views
0

我已經閱讀了關於Set的所有內容,並且它們不適合帳單,因爲我的對象不可哈希(這很常見)。向數組添加唯一對象

我有一個Product

class Product: Object { 

    dynamic var sku: String! 
    dynamic var name: SomeUnhashableType! 
    dynamic var weight: String!  
} 

let uniqueProductArray = [productOne, productTwo, productThree] 

uniqueProductArray.append(productOne) 

我讀過有關使用containsindexOffilter等,但它們都使用謂詞,我想非謂語方法。

阻止重複對象被追加到數組的最優雅的方式是什麼?

+0

如果你的對象是由如String哈希的對象,爲什麼不哈希的實施和使用一套?您可以將您的字符串連接在一起,並針對您的散列實現的結果調用散列。 –

+0

@CharlesA。編輯的原因那不是真正的問題,除了爲什麼不只是使用一套,如果他們可以清除? –

+0

@rayjohn:使用'contains'來檢查對象已經包含在數組中的添加相同。 –

回答

2

通過將該協議添加到定義並通過爲您的課程實施==來爲您的課程Equatable。然後你可以使用contains不使用謂詞版本:

class Product: Object, Equatable { 
    dynamic var sku: String! 
    dynamic var name: String! 
    dynamic var weight: String! 
} 

func == (lhs: Product, rhs: Product) -> Bool { 
    return lhs.sku == rhs.sku && lhs.name == rhs.name && lhs.weight == rhs.weight 
} 

let productOne = Product() 
productOne.sku = "one" 
productOne.name = "name" 
productOne.weight = "heavy" 

let productTwo = Product() 
productTwo.sku = "two" 
productTwo.name = "name" 
productTwo.weight = "heavy" 

let productThree = Product() 
productThree.sku = "three" 
productThree.name = "name" 
productThree.weight = "heavy" 

var uniqueProductArray = [productOne, productTwo] 

if !uniqueProductArray.contains(productThree) { 
    uniqueProductArray.append(productThree) 
}