swift - 如何从类数组中获取不同的值?

标签 swift xcode

我找到了很多关于如何从数组中获取不同值的示例,例如:

[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/

相关文章:

ios - 防止 iAd 转移其他 View

regex - 如何快速从文本中提取所有电子邮件地址

ios - 如何更改坐标注释的图像?

swift - 插入和删除时出现 'NSInternalInconsistencyException',第 0 节中的无效行数错误?

iphone - 使用带有 iPhone SDK 3.1 的 Xcode 3.1.4 时从电子邮件导入文件

ios - 在 Swift 框架中打包 XIB 进行分发?

ios - 在我的 TabBarViewController 中,如何为 viewDidLoad 上的每个 subview Controller 设置一个实例变量?

ios - 如何在 swift 中使用 ObjectMapper 将值从 String 向下舍入为 Double

ios - 如何在 UIPickerView 中只显示一行?

ios - 仅当设备连接到 MacBook 时后台应用程序才工作时的 didReceiveRemoteNotification