数组的唯一值在swift中

我正在用swift构buildiOS应用程序,我需要获取string数组的所有唯一值。

我一直在阅读苹果开发者文档,但它似乎没有一个function。

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

一种方法是使用一个集合:

 let array = ["one", "one", "two", "two", "three", "three"] let unique = Array(Set(array)) // ["one", "two", "three"] 

你也可以创build一个更明确地过滤数组的扩展:

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

注意

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

(Swift 2)可能是一个很好的延伸:

 extension Array where Element : Hashable { var unique: [Element] { return Array(Set(self)) } } 

有可能更多的优化方式来做你想要的,但这种方式是快速和容易的。

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

 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"] 

这有一个缺点,就是要求序列的内容是可排列的,而不仅仅是可以等同的,但是再次是大多数可比较的东西,包括string。

它也保留了原来的顺序,比如把内容放在字典或集合中,然后再把它们取出来。

我不知道有一个build造的方式。 这个通用函数可以做到这一点:

 func distinct<S: SequenceType, E: Equatable where E==S.Generator.Element>(source: S) -> [E] { var unique = [E]() for item in source { if !contains(unique, item) { unique.append(item) } } return unique } 

这里的缺点是这个解决scheme运行在O(n 2 )。

使用类似var unique = [<yourtype>:Bool]()的字典,并在循环中填充像unique[<array value>] = true 。 现在unique.keys拥有你所需要的。