簡體   English   中英

將兩個不同類型的數組排序為一個

[英]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協議負擔TypeATypeB類,則可以選擇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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM