将Swift类型存储在变量

时间:2016-02-22 13:59:09

标签: swift generics swift2

我有UITableViewCell的数据模型,如下所示:

class SettingsContentRow {
    var title: String
    var cellType: Type // How do i do this?
    var action:((sender: UITableViewCell.Type) -> ())?

    var identifier: String {
        get { return NSStringFromClass(cellType) }
    }

    init(title: String, cellType: Type) {
        self.title = title
        self.cellType= cellType
    }
}

我们的想法是将它们放在一个数组中以便于使用UITableViewController构建设置视图,并且在请求单元格时,我可以只查询标识符和单元格Type的模型。但我无法弄清楚要使用哪个关键字而不是Type。我尝试过TypeAnyClassUITableViewCell.Type,当我尝试实例化模型类时,它们都会引起类型分配错误。

1 个答案:

答案 0 :(得分:1)

您想要的语法是UITableViewCell.Type。这是UITableViewCell的子类的类型。您可以使用AnyClass接受任何类的类型,但通常应该避免这种情况。大多数情况下,如果您认为自己需要AnyClass,那么您真的需要通用。

当您尝试将类型传递给此init时,它将类似于:

SettingsContentRow("title", cellType: MyCell.self)

直接引用类型有点不常见,因此Swift要求您明确添加.self

无论如何,你可能实际上想要一个通用的。我可能会这样写:

final class SettingsContentRow<Cell: UITableViewCell> {
    typealias Action = (Cell) -> ()
    let title: String
    let action: Action?

    var identifier: String {
        get { return NSStringFromClass(Cell.self) }
    }

    init(title: String, action: Action?) {
        self.title = title
        self.action = action
    }
}

class MyCell: UITableViewCell {}

let row = SettingsContentRow(title: "Title", action: { (sender: MyCell) in } )