如果不存在,有人会给出一个"追加的片段" swift数组中的方法?

时间:2017-10-02 03:10:55

标签: ios arrays swift append

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

3 个答案:

答案 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()