![](/img/trans.png)
[英]Sort and merge & sort again two arrays having different key-valued objects in Objective-C
[英]Sort Two Arrays of Different Types into One
我有兩個數組,它們是兩個不同的對象,並且都包含一個ID字段。 我需要做的是在表視圖控制器中按順序顯示它們。 它們共享相同的基本信息,大小和ID,除了顯示的是對象類型之外,它們是唯一顯示的數據。 當用戶選擇一個單元格時,它將移動到一個新視圖,該視圖顯示該對象的詳細信息。
現在,表中有兩個部分,一個部分用於TypeA,另一部分用於TypeB。 他們對各自列表中的所有項目進行排序,但在制造項目時卻無序。 所以看起來像:
TypeA
ID 1
ID 2
ID 5
ID 6
TypeB
ID 3
ID 4
ID 7
我需要的是將它們全部分類為1個部分,並在選擇時仍打開詳細視圖。
思考
我可以將它們全部放入AnyObject字典中,並在查看單個項目時確定它們是否屬於一種對象類型或另一種。 我覺得這行得通,但是我該如何正確地對其進行排序呢?
將所有通用屬性放入協議中,構建並排序該通用協議的數組:
protocol HasID {
var id: Int { get }
}
class TypeA : HasID, CustomStringConvertible {
var id: Int
init(_ id: Int) {
self.id = id
}
var description : String {
return ("TypeA(\(self.id))")
}
}
class TypeB : HasID, CustomStringConvertible {
var id: Int
init(_ id: Int) {
self.id = id
}
var description : String {
return ("TypeB(\(self.id))")
}
}
let typeA = [TypeA(1), TypeA(2), TypeA(5), TypeA(6)]
let typeB = [TypeB(3), TypeB(4), TypeB(7)]
let result: [HasID] = (typeA + typeB).sorted { $0.id < $1.id }
print(result)
[TypeA(1), TypeA(2), TypeB(3), TypeB(4), TypeA(5), TypeA(6), TypeB(7)]
如果您不想使用HasID
協議負擔TypeA
和TypeB
類,則可以選擇Zoff Dino答案,然后可以在視圖控制器中為這些類定義擴展:
class TypeA {
var ID: Int
init(_ id: Int) {
self.ID = id
}
}
class TypeB {
var ID: Int
init(_ id: Int) {
self.ID = id
}
}
protocol HasID {
var ID: Int { get }
}
// place this in your view controller
extension TypeA: HasID {
}
extension TypeB: HasID {
}
var arrayA = [TypeA(1), TypeA(3), TypeA(5)]
var arrayB = [TypeB(2), TypeB(4)]
let sortedArray = (arrayA.map { $0 as HasID } + arrayB.map { $0 as HasID })
.sort { $0.ID < $1.ID }
您可以這樣做:
class TypeA {
var ID: Int
init(_ id: Int) {
self.ID = id
}
}
class TypeB {
var ID: Int
init(_ id: Int) {
self.ID = id
}
}
struct Wrap {
var ID: Int {
return a?.ID ?? b?.ID ?? 0
}
let a: TypeA?
let b: TypeB?
}
var arrayA = [TypeA(1), TypeA(3), TypeA(5)]
var arrayB = [TypeB(2), TypeB(4)]
let sortedArray = (arrayA.map { Wrap(a: $0, b: nil) } + arrayB.map { Wrap(a: nil, b: $0)})
.sorted { $0.ID < $1.ID }
選擇行后,您可以通過以下方式確定對象:
if let a = sortedArray[index].a {
// TypeA row selected
} else if let b = sortedArray[index].b {
// TypeB row selected
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.