2015-10-06 131 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 } 
相关问题