作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了很多关于如何从数组中获取不同值的示例,例如:
[1, 2, 2, 3, 4, 5, 6]
然后我可以执行 Array(Set(myArray))
,但是,当数组值是一个类时,这不起作用。
但是,我需要的是从数组中的类的属性中获取不同值的列表,例如此类:
class Alert: Decodable {
var id: Int?
var category: String?
var category_id: Int?
var summary: String?
var title: String?
var publish_date: String?
}
我想从我的数组中获取“类别”列表。
我知道我可以只循环遍历数组,如果值不存在则追加一个新数组。不确定这是否是最有效的方法,或者是否有更快捷的做事方法。
我发现我可以做到:
let categories = self.items!.map { $0.category }
这将获得类别列表,但不确定如何区分它们。我尝试了 Array(Set(
,但这不起作用。我收到以下错误:
Generic parameter 'Element' could not be inferred
我对 swift 比较陌生,所以我知道我想做什么,只是无法从语法上弄清楚。
任何指导将不胜感激。
最佳答案
Set
要求您的元素是Hashable
。这意味着它们必须是 Equatable
并提供哈希值。
如果您的目标是创建独特类别的列表,那么您应该从创建类别数组开始:
let categories = (self.items ?? []).compactMap { $0.category }
然后您可以使用 Set
简单地获取唯一类别:
let uniqueCategories = Array(Set(categories))
但是,请注意 Set
不会保持项目有序。如果您还需要保持 categories
的顺序,那么我会推荐一个简单的 Array
扩展:
extension Array where Element: Hashable {
func distinct() -> Array<Element> {
var set = Set<Element>()
return filter {
guard !set.contains($0) else { return false }
set.insert($0)
return true
}
}
}
或使用 Set.insert
返回值(Leo Dabus 的想法)进行简化:
extension Array where Element: Hashable {
func distinct() -> Array<Element> {
var set = Set<Element>()
return filter { set.insert($0).inserted }
}
}
然后
let uniqueCategories = (self.items ?? [])
.flatMap { $0.category }
.distinct()
关于swift - 如何从类数组中获取不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49576235/
我是一名优秀的程序员,十分优秀!