有人可以在快速数组中给出“如果不存在则追加”方法的片段吗?
Posted
技术标签:
【中文标题】有人可以在快速数组中给出“如果不存在则追加”方法的片段吗?【英文标题】:Can somebody give a snippet of "append if not exists" method in swift array? 【发布时间】:2018-03-13 03:22:08 【问题描述】:因为我经常使用这个程序,有人可以创建一个 Swift 数组的扩展方法,它会检测要追加的数据是否已经存在,然后它没有追加?我知道这只是几个这样的代码的问题:
var arr = [Int]()
for element in inputArr
if !arr.contains(element) arr.append(element);
变成:
var arr = [Int]()
for element in inputArr arr.appendUnique(element);
或者:
var arr = [String]()
for element in inputArr
if !arr.contains(element) arr.append(element);
变成:
var arr = [String]()
for element in inputArr arr.appendUnique(element);
不同元素类型的方法相同。坦率地说,从这个简单的代码中,我还想了解如何使用变量类型扩展Collection
。让我着迷的是,当对象使用不同的参数类型初始化时,Array 的方法如何具有不同的参数类型。数组和字典是我仍然不知道如何正确扩展它们的两件事。谢谢。
【问题讨论】:
为什么不使用 Set 来代替? 一组没有顺序 【参考方案1】:您可以扩展RangeReplaceableCollection
,将其元素限制为Equatable
,并将您的方法声明为变异。如果您想在追加成功的情况下返回 Bool,您还可以使结果可丢弃。您的扩展程序应如下所示:
extension RangeReplaceableCollection where Element: Equatable
@discardableResult
mutating func appendIfNotContains(_ element: Element) -> (appended: Bool, memberAfterAppend: Element)
if let index = firstIndex(of: element)
return (false, self[index])
else
append(element)
return (true, element)
【讨论】:
如果Element
是Equatable
,你可以直接使用!contains(element)
哇哦,@discardableResult
,Equatable
,Element
,我在一篇文章中学到了很多东西!我一直在考虑如何使结果可丢弃,所以我不需要使用_ = ...
,但不知道存在这样的东西,所以我从不查找。谢谢!!!【参考方案2】:
我需要添加一个独特的元素(如果它已经存在,请先删除它)。
extension RangeReplaceableCollection where Element: Equatable
mutating func prependUnique(_ element: Element)
if let index = firstIndex(of: element)
remove(at: index)
insert(element, at: startIndex)
【讨论】:
这种方法与接受答案方法的区别在于接受答案方法保留了现有的对象索引,而这种方法使用了新的对象索引。但我的问题是关于附加数据的。就我而言,最好保留现有的对象索引。但感谢您的意见。【参考方案3】:在我的情况下,我正在过滤结果并在单击搜索按钮时附加 api 响应,但附加唯一会减慢过程,因为它必须检查每个索引是否唯一,我基本上将我的本地数组设置为空或只是 arr.removeAll() .
【讨论】:
以上是关于有人可以在快速数组中给出“如果不存在则追加”方法的片段吗?的主要内容,如果未能解决你的问题,请参考以下文章
Erlang - 在外部文件中搜索特定字符串,如果不存在则追加文件