一尘不染

有人可以在swift数组中给出“如果不存在,追加”的代码段吗?

swift

因为我经常使用此例程,所以有人可以创建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的方法如何具有不同的参数类型都使我着迷。数组和字典是我仍然无法正确扩展它们的两件事。谢谢。


阅读 219

收藏
2020-07-07

共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)
        }
    }
}
2020-07-07