有人可以在 swift 数组中给出"append if not exists"方法的片段吗?



,因为我经常使用此例程,所以有人可以创建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()。

相关内容

最新更新