【问题标题】:Swift Group Sequential Objects in Array数组中的 Swift 分组顺序对象
【发布时间】:2021-06-11 21:19:29
【问题描述】:

我有以下对象数组:

[Car, Train, Train, Motorbike, Train, Car, Car]

我想将任何相同类型的对象分组,结果如下:

[Car, [Train, Train], Motorbike, Train, [Car, Car]]

甚至更好:

[Car, GroupOfVehicles(type: .train, vehicles:[Train, Train]), Motorbike, Train, GroupOfVehicles(type: .car, vehicles:[Car, Car])

我发现了一些关于按属性分组的 SO 帖子,但我需要保持数组的顺序性不变。

对于那些对我的目标感兴趣的人:我想在一个表格中显示一个在另一个下方的对象,但是如果有一组相似的连续对象,它们应该全部显示在同一“行”上,因此用户将水平滚动它们。

【问题讨论】:

  • 您是否为您的车辆类型使用任何协议或超类?

标签: arrays swift grouping swift5


【解决方案1】:

你可以使用开源swift包Swift Alogrithms中的chunked(by:)函数

import Algorithms

protocol X {} // Assuming that you have protocol or superclass 
struct A: X {}; struct B: X {}; struct C: X {}

let arr: [X] = [A(), A(), B(), C(), C(), C(), B(), A()]

let chunks = arr.chunked { type(of: $0) == type(of: $1) }

// You should have something like this [ArraySlice([A(), A()]), ArraySlice([B()]), ArraySlice([C(), C(), C()]), ArraySlice([B()]), ArraySlice([A()])]

您可以根据需要进一步转换此集合。

【讨论】:

    【解决方案2】:

    以下是基于Any 数组的解决方案,但如果所有类型都符合通用协议或具有通用超类,那么希望可以以更有效的方式解决。

    var grouped: [[Any]] = []
    var previous: String = ""
    motors.forEach {
        let vehicleType = "\(type(of: $0))"
        if vehicleType != previous {
            grouped.append([$0])
            previous = vehicleType
        } else {
            grouped[grouped.count - 1].append($0)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多