Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 有人能给我一个“小”字吗;如果不存在,则追加“;swift数组中的方法?_Ios_Arrays_Swift_Append - Fatal编程技术网

Ios 有人能给我一个“小”字吗;如果不存在,则追加“;swift数组中的方法?

Ios 有人能给我一个“小”字吗;如果不存在,则追加“;swift数组中的方法?,ios,arrays,swift,append,Ios,Arrays,Swift,Append,因为我经常使用这个例程,有人能创建一个Swift数组的扩展方法来检测要追加的数据是否已经存在,然后就不追加了吗?我知道这只是一些类似这样的代码的问题: var arr = [Int]() for element in inputArr { if !arr.contains(element) { arr.append(element); } } extension RangeReplaceableCollection where Element: Equatable { @dis

因为我经常使用这个例程,有人能创建一个Swift数组的扩展方法来检测要追加的数据是否已经存在,然后就不追加了吗?我知道这只是一些类似这样的代码的问题:

var arr = [Int]()
for element in inputArr {
    if !arr.contains(element) { arr.append(element); }
}
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)
        }
    }
}
变成:

var arr = [Int]()
for element in inputArr { arr.appendUnique(element); }
var arr = [String]()
for element in inputArr { arr.appendUnique(element); }
或:

变成:

var arr = [Int]()
for element in inputArr { arr.appendUnique(element); }
var arr = [String]()
for element in inputArr { arr.appendUnique(element); }

对于不同的元素类型,使用相同的方法。坦白地说,从这段简单的代码中,我还想学习如何使用变量类型扩展
集合。每当用不同的参数类型初始化对象时,数组的方法就可以有不同的参数类型,这让我很着迷。数组和字典是我仍然不知道如何正确扩展它们的两件事。谢谢。

您可以扩展
RangeReplaceableCollection
,将其元素约束为
equalable
,并将方法声明为mutating。如果希望在追加成功的情况下返回Bool,还可以使结果可丢弃。您的扩展应该如下所示:

var arr = [Int]()
for element in inputArr {
    if !arr.contains(element) { arr.append(element); }
}
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)
        }
    }
}

我需要预先准备一个唯一的元素(如果它已经存在,则首先删除它)


在我的例子中,我过滤结果并在单击搜索按钮时附加api响应,但附加唯一性会减慢过程,因为它必须检查每个索引的唯一性,我基本上使我的本地数组为空或只是arr.removeAll()。

为什么不使用Set呢?如果
元素
相等的
,则Set没有orderIf,您只需使用
!包含(元素)
噢,哇,
@discardableResult
equalable
元素
,我在一篇文章中学到了很多东西!我一直在考虑如何使结果可丢弃,这样我就不需要使用
。=…
,但我不知道这样的东西存在,所以我从不查找它。谢谢此方法与接受答案方法的区别在于,接受答案方法保留现有对象索引,而此方法使用新对象索引。但我的问题是关于附加数据的。在我的例子中,最好是保留现有的对象索引。但是谢谢你的意见。