,因为我经常使用此例程,所以有人可以创建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的方法如何具有不同的参数类型,这让我着迷。阵列和词典是我仍然无法正确扩展它们的两件事。谢谢。
您可以扩展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)
}
}
}
我需要预处一个唯一的元素(如果已经存在,则首先将其删除)。
extension RangeReplaceableCollection where Element: Equatable
{
mutating func prependUnique(_ element: Element) {
if let index = firstIndex(of: element) {
remove(at: index)
}
insert(element, at: startIndex)
}
}
在我的情况下,我正在使用API响应单击搜索按钮时进行过滤结果,但是附加添加的过程唯一放慢了过程,因为它必须检查每个索引是否符合唯一的唯一,我基本上使我的本地数组制作了空或简单地arr.removeall()。