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)执行此操作
【问题讨论】:
append
在 MutableCollection
上不存在,因为并非所有可变集合都支持像 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:如果不重复则附加到数组的扩展的主要内容,如果未能解决你的问题,请参考以下文章