因为我经常使用这个例程,有人可以创建一个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的方法可以具有不同的参数类型,这让我着迷。数组和字典是我仍然无法正确扩展它们的两件事。感谢。
答案 0 :(得分:13)
您可以扩展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)
}
}
}
答案 1 :(得分:0)
我需要添加一个唯一元素(如果已经存在,请先将其删除)。
extension RangeReplaceableCollection where Element: Equatable
{
mutating func prependUnique(_ element: Element) {
if let index = firstIndex(of: element) {
remove(at: index)
}
insert(element, at: startIndex)
}
}
答案 2 :(得分:0)
在我的情况下,我正在过滤结果并附加带有api响应的单击搜索按钮,但是由于必须检查每个索引的唯一性,因此添加唯一地减慢了该过程的速度,我基本上将本地数组设置为空或将arr.removeAll()