Ios 将两个不同类型的数组排序为一个

Ios 将两个不同类型的数组排序为一个,ios,arrays,swift,sorting,object,Ios,Arrays,Swift,Sorting,Object,我有两个数组,它们由两个不同的对象组成,并且都包含一个ID字段。我需要做的是在表视图控制器中按顺序显示它们。它们共享相同的基本信息、大小和ID,除了对象的类型之外,这些是唯一显示的数据。当用户选择一个单元时,它将移动到一个新视图,该视图显示对象的更精细细节 现在,表中有两个部分,一个用于TypeA,另一个用于TypeB。它们对各自列表中的所有项目进行排序,但在创建项目时顺序不正确。所以它看起来像: TypeA ID 1 ID 2 ID 5 ID 6 TypeB ID 3

我有两个数组,它们由两个不同的对象组成,并且都包含一个ID字段。我需要做的是在表视图控制器中按顺序显示它们。它们共享相同的基本信息、大小和ID,除了对象的类型之外,这些是唯一显示的数据。当用户选择一个单元时,它将移动到一个新视图,该视图显示对象的更精细细节

现在,表中有两个部分,一个用于TypeA,另一个用于TypeB。它们对各自列表中的所有项目进行排序,但在创建项目时顺序不正确。所以它看起来像:

TypeA
  ID 1
  ID 2
  ID 5
  ID 6
TypeB
  ID 3
  ID 4
  ID 7
我需要的是将它们全部排序为一个部分,并在选中时仍然打开详细视图

思想


我可以将它们全部放入AnyObject字典中,在查看单个项目时,确定它们是一种对象类型还是另一种对象类型。我觉得这样做行得通,但我该如何正确地进行排序呢?

您可以这样做:

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 }

将所有公共属性放入协议中,然后生成该公共协议的数组并对其排序:

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)

除了Zoff Dino answer之外,如果您不想使用
HasID
协议来增加
TypeA
TypeB
类的负担,那么您可以在视图控制器中定义对这些类的扩展:

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 }
A类{
变量ID:Int
init(id:Int){
self.ID=ID
}
}
B类{
变量ID:Int
init(id:Int){
self.ID=ID
}
}
协议HasID{
变量ID:Int{get}
}
//将其放置在视图控制器中
扩展类型a:HasID{
}
扩展类型b:HasID{
}
var arrayA=[TypeA(1)、TypeA(3)、TypeA(5)]
var arrayB=[TypeB(2),TypeB(4)]
设sortedArray=(arrayA.map{$0作为HasID}+arrayB.map{$0作为HasID})
.sort{$0.ID<$1.ID}

感谢您的回复。这就是我用你的建议得到的呼啦圈:1呼啦圈:2呼啦圈:3呼啦圈:4呼啦圈:7呼啦圈:10呼啦圈:15线性:1线性:2线性:8线性:9线性:11线性:12线性:13线性:14呼啦圈和线性是A型和B型。知道发生了什么吗?@CodyHarness你不恰当地采纳了我的解决方案。如果您在Playerd中复制并粘贴我的代码,您将看到它工作正常。@CodyHarness您确定您的代码包含
.sort{$0.ID<$1.ID}
?Swift的早期版本中有一个错误,它阻止数组正确排序。如果在仔细检查代码后仍然没有看到数组被排序,请尝试更新您的Xcode/SDK版本。@cc。我发现了我的错误。我根据对象中错误的id值进行排序。它正在工作。最好在swift 2中使用间接枚举
[TypeA(1), TypeA(2), TypeB(3), TypeB(4), TypeA(5), TypeA(6), TypeB(7)] 
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 }