我正在使用 Swift 构建 iOS 应用程序,需要获取字符串数组的所有唯一值。
我已经阅读了 Apple 开发者文档,但似乎没有相应的函数可用。
有人可以给我一个提示吗?
可能存在更加高效的方法,但扩展程序可能是最直接的选择:
extension Array where Element: Equatable {
var unique: [Element] {
var uniqueValues: [Element] = []
forEach { item in
guard !uniqueValues.contains(item) else { return }
uniqueValues.append(item)
}
return uniqueValues
}
}
如果顺序不重要且对象也可哈希:
let array = ["one", "one", "two", "two", "three", "three"]
// order NOT guaranteed
let unique = Array(Set(array))
// ["three", "one", "two"]
Array(Set())
在 Swift 4 中同样适用。非常好的解决方案。谢谢。 - Anjan BiswasSwift标准库中没有这样的函数,但您可以编写一个功能:
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"]
这种方法的缺点是需要使序列的内容成为可哈希的,而不仅仅是可比较的,但是大多数可比较的东西都可以被哈希,包括字符串。
与将内容放入字典或集合中再重新获取不同,此方法也可以保留原始顺序。
使用未解决的标识符'seq'
- μολὼν.λαβέfilter(source)
。 - Airspeed Velocitysource.filter
。 - robvar seen = Set<Element>() return filter { seen.update(with: $0) == nil }
- Igor Palaguta我不知道有内置的方法。这个通用函数可以做到:
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
}
使用类似于var unique = [<yourtype>:Bool]()
的字典,并在循环中填入值,例如unique[<array value>] = true
。现在unique.keys
中包含了你所需要的内容。
$.uniq(array)
https://github.com/ankurp/Dollar#uniq---uniq - Andrewuniqued()
方法。更多信息请参见https://dev59.com/Q18e5IYBdhLWcg3wdqGT#70210590 - Kaunteya