2015-11-06 72 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) 
}