2015-10-06 180 views
1

我有兩個數組,它們是兩個不同的對象,都包含一個ID字段。我需要做的是在一個表視圖控制器中按順序顯示它們。它們共享相同的基本信息,大小和ID,除了它所對象的類型之外,它們是唯一顯示的數據片段。當用戶選擇一個單元格時,它會移動到一個新的視圖,顯示該對象的更精細的細節。將不同類型的兩個陣列合併爲一個

現在,我在表格中有兩個部分,一個用於TypeA,另一個用於TypeB。他們對各自列表中的所有項目進行排序,但在項目製作完成後無法完成。所以它看起來像:

TypeA 
    ID 1 
    ID 2 
    ID 5 
    ID 6 
TypeB 
    ID 3 
    ID 4 
    ID 7 

我需要的是爲它所有這些分類到1段,在選擇時還是打開詳細資料視圖。

思考

我可以把他們都到AnyObject字典,看單個項目時,確定他們是否是一個對象類型或其他的。我覺得這樣做會工作,但我將如何正確分揀?

+0

它更好地使用SWIFT 2間接枚舉用於此目的 – Mousavian

回答

3

你可以做到這一點,像這樣:

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)}) 
         .sort { $0.ID < $1.ID } 

當行被選中,你可以判斷物體:

if let a = sortedArray[index].a { 
    // TypeA row selected 
} else if let b = sortedArray[index].b { 
    // TypeB row selected 
} 
+0

感謝您的答覆。這是我收到的時候我用你的建議 呼啦:1 草裙舞:2 草裙舞:3 草裙舞:4 草裙舞:7 草裙舞:10 草裙舞:15 線性:1 線性:2 線性:8 線性:9 線性:11 線性:12 線性:13 線性:14 凡呼啦和線性是類型A和類型B。任何想法發生了什麼? –

+0

@CodyHarness您錯誤地採用了我的解決方案。如果您在操場上覆制並粘貼我的代碼,您會發現它可以正常工作。 – mixel

+0

@CodyHarness你確定你的代碼包含'.sort {$ 0.ID <$ 1.ID}'嗎? – mixel

3

將所有公共屬性轉換成協議,構建和排序的數組該共同的協議:

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 = (typeA.map { $0 as HasID } + typeB.map { $0 as HasID }) 
       .sort { $0.id < $1.id } 

print(result) 
0

或者Zoff迪諾如果你不想負擔的答案TypeATypeB班,HasID協議,那麼你可以在你的視圖控制器定義擴展到這些類:

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 } 
相關問題