【问题标题】:how to handle two different types in an Array in Swift for a UITableView如何在 Swift 中为 UITableView 处理数组中的两种不同类型
【发布时间】:2015-06-10 15:53:45
【问题描述】:

我们正在考虑将应用程序从 obj-c 迁移到 Swift。一个问题是我们的 obj-c 代码中有一个 UITableView,它的对象要么是 Header 类型,要么是 Item 类型。基本上,它解析了它在 cellForRowAtIndexPath 处的类型。 Swift 数组(据我所知) 只能处理一种类型。鉴于此,我们如何处理要在 UITableView 中使用的两种不同类型?像 DataObj 这样的包装器对象,我们有每个工作的 nillable 实例吗?

【问题讨论】:

  • 可以使用 NSMutableArray/NSArray 吗?
  • 嗯......所以......可能但似乎有点权宜之计,除非我弄错了(老实说不是全职的iOS开发人员)。我敢肯定,几乎大多数项目都必须处理这个问题。使用 NSMutablreArray 会是规范的选择吗?感觉有点像在脚本语言中使用exec

标签: swift uitableview


【解决方案1】:

这是一种使用协议来联合两个类的方法:

protocol TableItem {

}

class Header: TableItem {
    // Header stuff
}

class Item: TableItem {
    // Item stuff
}

// Then your array can store objects that implement TableItem
let arr: [TableItem] = [Header(), Item()]

for item in arr {
    if item is Header {
        print("it is a Header")
    } else if item is Item {
        print("it is an Item")
    }
}

[AnyObject]NSMutableArray 相比,它的优势在于只有实现TableItem 的类才允许出现在您的数组中,因此您可以获得额外的类型安全性。

【讨论】:

  • 我在尝试这个时无法转换类型的值。有什么建议吗?
【解决方案2】:

Swift 数组可以存储不同类型的对象。为此,您必须声明为 AnyObject 数组

var array:[AnyObject] = []

cellForRowAtIndexPath 之后,您可以使用可选的展开来获取对象的类型

if let header = array[indexPath.row] as? Header{
    //return header cell here
}else{

    let item = array[indexPath.row] as! Item

    // return item cell

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多