Swiftt3:如果不重复则附加到数组的扩展

Posted

技术标签:

【中文标题】Swiftt3:如果不重复则附加到数组的扩展【英文标题】:Swiftt3: Extension to append to Array if not duplicate 【发布时间】:2016-11-25 02:32:23 【问题描述】:

我正在尝试为 Array 编写一个扩展,仅当该元素在 Array 中不存在时才将元素附加到 Array。

这是我的代码:

extension MutableCollection where Iterator.Element: Equatable 
    mutating func addObjectIfNew <T: Equatable> (_ item: T)  
        if !self.contains(item as! Self.Iterator.Element)  
            self.append(x as! Self.Iterator.Element) // offending line
        
    

我得到这个错误:

错误:'Self' 类型的值没有成员'append'

编写此类扩展的正确方法是什么?

更新:我不能使用 Set,因为我需要对需要索引的对象(即 Array)执行此操作

【问题讨论】:

appendMutableCollection 上不存在,因为并非所有可变集合都支持像 Array 这样的任意大小。将此作为Array 的扩展名。 另外,小心这个,它是一个线性时间操作。如果你做的很多,最好用一套。 您已经将集合类型限制为 equatable,因此无需在您的方法中使用 T: Equatable 套装做你想做的“开箱即用”。如果你需要一个有序的集合,你可以使用 NSOrderedSet(我猜在 Swift 3 中它被称为 OrderedSet @LeoDabus 这行得通!您能否将其添加为答案,以便我将其标记为正确答案? 【参考方案1】:

您已经将集合元素限制为 equatable,因此无需在您的方法中创建新的通用 equatable 类型:

extension RangeReplaceableCollection where Element: Equatable 
    mutating func appendIfNotContains(_ element: Element)  
        if !contains(element)  append(element) 
    

【讨论】:

以上是关于Swiftt3:如果不重复则附加到数组的扩展的主要内容,如果未能解决你的问题,请参考以下文章

在两个字典数组中查找重复键以使用新数组字典更新旧数组字典

不修改数组找出重复的数字

数组中重复数字

java 判断一个数组中是不是有重复的元素

[剑指Offer] 50.数组中重复的数字

如果数组中存在重复值,则增加对象的计数属性