我正在使用swift构建iOS应用程序,我需要获取字符串数组的所有唯一值。
我一直在阅读苹果开发者文档,但它似乎没有它的功能。
有人能给我一个提示吗?
答案 0 :(得分:129)
一种方法是使用集合:
let array = ["one", "one", "two", "two", "three", "three"]
let unique = Array(Set(array))
// ["one", "two", "three"]
您还可以创建一个更明确地过滤数组的扩展名:
extension Array where Element : Equatable {
var unique: [Element] {
var uniqueValues: [Element] = []
forEach { item in
if !uniqueValues.contains(item) {
uniqueValues += [item]
}
}
return uniqueValues
}
}
注意强>
唯一数组将以未指定的顺序排列,您可能需要对其进行排序。有时通过枚举自己做得更好,你可以写一个扩展名。
进行扩展(Swift 2)可能会很好:
extension Array where Element : Hashable {
var unique: [Element] {
return Array(Set(self))
}
}
可能有更多优化的方法可以做到你想要的,但这种方式既快捷又简单。
答案 1 :(得分:50)
在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"]
这有一个缺点,就是要求序列的内容可以清除,而不仅仅是等同的,但是大多数等同的东西都是,包括字符串。
它还保留了原始顺序,例如,将内容放入字典或集合中,然后再将它们取回。
答案 2 :(得分:3)
我不知道内置的方式。这个通用函数可以做到这一点:
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
}
这方面的缺点是该解决方案在O(n 2 )中运行。
答案 3 :(得分:1)
使用var unique = [<yourtype>:Bool]()
之类的字典,并在循环中填写unique[<array value>] = true
之类的值。现在unique.keys
已满足您的需求。