根据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
,因为String
比Int
的效率低很多,使用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!})
而不需要使结构相等。
请注意,如果数组非常大,这可能不会有效,如果可能的话,您可能需要考虑在源数组中过滤插入数组。