swift中数组的唯一值

use*_*505 66 ios swift

我正在用swift构建一个iOS应用程序,我需要获得字符串数组的所有唯一值.

我一直在阅读苹果开发者文档,但它似乎没有它的功能.

有人可以给我一个提示吗?

Log*_*gan 144

一种方法是使用一组:

let array = ["one", "one", "two", "two", "three", "three"]
let unique = Array(Set(array))
// ["one", "two", "three"]
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个更明确地过滤数组的扩展:

extension Array where Element : Equatable {
    var unique: [Element] {
        var uniqueValues: [Element] = []
        forEach { item in
            if !uniqueValues.contains(item) {
                uniqueValues += [item]
            }
        }
        return uniqueValues
    }
}
Run Code Online (Sandbox Code Playgroud)

注意

唯一数组将以未指定的顺序排列,您可能需要对其进行排序.有时最好通过枚举自己做,你可以写一个扩展.

进行扩展(Swift 2)可能会很好:

extension Array where Element : Hashable {
    var unique: [Element] {
        return Array(Set(self))
    }
}
Run Code Online (Sandbox Code Playgroud)

可能有更多优化的方法来做你想要的,但这种方式快速而简单.

  • @BB9z 我在答案中指出了这一点,并且还提供了一个可以保留顺序的扩展名,所以不知道您在这里想要什么:) (5认同)
  • 第一个例子简洁明了.适用于Swift 3.谢谢! (3认同)
  • `Array(Set())`也适用于Swift 4.好的解决方案 谢谢. (3认同)
  • 消极的。您可以使用 set 获得随机顺序。 (3认同)

Air*_*ity 53

在Swift标准库中没有这样做的功能,但你可以写一个:

extension Sequence where Iterator.Element: Hashable {
    func unique() -> [Iterator.Element] {
        var seen: [Iterator.Element: Bool] = [:]
        return self.filter { seen.updateValue(true, forKey: $0) == nil }
    }
}

let a = ["four","one", "two", "one", "three","four", "four"]
a.unique // ["four", "one", "two", "three"]
Run Code Online (Sandbox Code Playgroud)

这有一个缺点,就是要求序列的内容是可以清除的,而不仅仅是等同的,但是大多数等同的东西都是,包括字符串.

它还保留了原始顺序,例如,将内容放在字典或集中,然后再将它们取回.

  • Set 也可用于 saw ``var saw = Set<Element>() return filter { saw.update(with: $0) == nil }``` (2认同)

qwe*_*_so 1

使用类似的字典并像循环var unique = [<yourtype>:Bool]()一样填写值。unique[<array value>] = true现在unique.keys有您需要的东西。