根据Swift中的struct属性删除数组中的重复结构

我做了一个简单的结构,并实现了Equatable协议:

extension MyModelStruct: Equatable {} func ==(lhs: NModelMatch, rhs: NModelMatch) -> Bool { let areEqual = lhs.id == rhs.id return areEqual } public struct MyModelStruct { var id : String? var staticId : String? init(fromDictionary dictionary: NSDictionary){ id = dictionary["id"] as? String ... } 

然后在我的项目中我得到一个[MyModelStruct]的数组,我该怎么做是删除所有具有相同ID的MyModelStruct

 let val1 = MyModelStruct(id:9, subId:1) let val2 = MyModelStruct(id:10, subId:1) let val3 = MyModelStruct(id:9, subId:10) var arrayOfModel = [val1,val2,val3]; // or set but i do not know how to use a set var arrayCleaned = cleanFunction[M2,M3] 

我如何使清洁function?

有人可以帮忙吗? 感谢所有。 Xcode:版本7.3.1

我真的不希望别人只是回答,因为这是唯一的答案,这就是为什么我要告诉你如何使用集合的力量。 集合用在任何不合理的情况下,不止一个,无论是否存在。 集提供快速的方法来检查一个元素是否在集合( contains ),删除元素( remove ),结合两个集合( union )等等。 通常人们只是想要一个数组,因为他们熟悉这个数组,但是通常情况下,一个数组就是他们所需要的。 就这样说,这里是你如何使用一套:

 struct Model : Hashable { var id : String? var hashValue: Int { return id?.hashValue ?? 0 } } func ==(l: Model, r: Model) -> Bool { return l.id == r.id } let modelSet : Set = [ Model(id: "a"), Model(id: "hello"), Model(id: "a"), Model(id: "test") ] // modelSet contains only the three unique Models 

为了在一个集合中唯一的要求是Hashable协议(它扩展了Equatable )。 在你的情况下,你可以返回String的底层hashValue 。 如果你的id总是一个数字(可能是这个数字),你应该改变id的types为一个Int ,因为StringInt的效率低很多,使用String是没有意义的。

另外考虑将这个属性存储在某个地方,这样每次你收到新的模型时,你都可以这样做

 modelSet.unionInPlace(newModels) 

使用一个Set而不是一个Array

我同意你最好使用Set。 您应该可以使用数组初始化Set,例如var arrayOfModel:Set = [val1,val2,val3]。 但是因为您使用的是自定义types,所以您需要确保MyModelStruct符合可散列性。 这个链接有一个很好的解释 。

但是如果你想使用一个数组,那么你需要改变

 let areEqual = rhs.id == lhs.id 

 let areEqual = rhs.id == lhs.id && rhs.subId == lhs.subId) 

你需要修改你的结构有一个subId属性(并使variablesInt而不是String。

回答你的问题,是的,你需要迭代数组。

如果使用此函数扩展数组types:

  extension Array { func uniqueValues<V:Equatable>( value:(Element)->V) -> [Element] { var result:[Element] = [] for element in self { if !result.contains({ value($0) == value(element) }) { result.append(element) } } return result } } 

您可以使用以下方式清理重复项:

  var arrayCleaned = arrayOfModel.uniqueValues({$0.id!}) 

而不需要使结构相等。

请注意,如果数组非常大,这可能不会有效,如果可能的话,您可能需要考虑在源数组中过滤插入数组。