【问题标题】:Swift sorting four different type object with same property in array (AnyObject)Swift对数组中具有相同属性的四个不同类型的对象(AnyObject)进行排序
【发布时间】:2021-01-09 12:58:35
【问题描述】:
class ComparedObject {
    let id: String
    let order: Int
    ...
}

class Object1 {
    let id: String
    let name: String
    ...
}

class Object2 {
    let id: String
    let x: Float
    ...
}

class Object3 {
    let id: String
    let y: Int
    ...
}

class Object4 {
    let id: String
    let z: Double
    ...
}

var comparedList: [ComparedObject] = [ComparedObject, ComparedObject, ComparedObject, ComparedObject]

var list = [AnyObject] = [Object2, Object1, Object3, Object4]

我有四个类,都有 id: String 属性。

我想将它们存储到一个 (AnyObject) 数组中以显示在 UICollectionView 中。

那么如何使用 compareList id 属性对列表数组进行排序?

comparedList 已经排序。

我想要从比较列表 id 属性中排序列表数组:

var comparedList = [
    ComparedObject(id: "01d7da417657", order: 0),
    ComparedObject(id: "61a96d769843", order: 1),
    ComparedObject(id: "5047abd36432", order: 2),
    ComparedObject(id: "3213f37a4003", order: 3)
]

var list = [
    Object2(id: "3213f37a4003", x: 34.0),
    Object1(id: "61a96d769843", name: "name"),
    Object3(id: "01d7da417657", y: 9),
    Object4(id: "5047abd36432", z: 0.3)
]

到这里:

var list = [
    Object3(id: "01d7da417657", y: 9),
    Object1(id: "61a96d769843", name: "name"),
    Object4(id: "5047abd36432", z: 0.3),
    Object2(id: "3213f37a4003", x: 34.0)
]

最后我这样做了:

comparedList = comparedList.sorted { $0.order < $1.order }
var comparedOrder = comparedList.map { $0.id }

list.sort { (comparedOrder.firstIndex(of: $0.id)! < comparedOrder.firstIndex(of: $1.id)! }

【问题讨论】:

标签: arrays swift sorting


【解决方案1】:

您只需要创建一个protocol 来定义id: String 属性的要求,然后使您的所有类型都符合所述协议,而不是将它们存储为AnyObject,而是将它们存储为协议类型。这将使您能够根据id 对数组进行排序。

protocol MyIdentifiable {
    var id: String { get }
}

struct ComparedObject: MyIdentifiable {
    let id: String
}

struct Object1: MyIdentifiable {
    let id: String
    let name: String
}

struct Object2: MyIdentifiable {
    let id: String
    let x: Float
}

struct Object3: MyIdentifiable {
    let id: String
    let y: Int
}

struct Object4: MyIdentifiable {
    let id: String
    let z: Double
}

let comparedList = [ComparedObject(id: "!")]
let list: [MyIdentifiable] = [Object1(id: "1", name: "1"), Object2(id: "2", x: 2.0)]
let sortedList = list.sorted(by: { $0.id < $1.id })

【讨论】:

  • 抱歉造成误会。我想从 compareList 数组 id 属性中对列表数组进行排序。
  • @hichkas 这与原始问题完全不同。如果您的实际问题不是如何将具有某些公共属性的不同类型存储在单个数组中并根据所述公共属性对它们进行排序,而是问题是如何根据另一个数组的顺序对数组进行排序,那么问题是Sorting a Swift Array by ordering from another Array 的副本
  • 感谢您的建议。我想出了如何排序。
猜你喜欢
  • 2022-06-10
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多