【问题标题】:Store Swift Type in variable将 Swift 类型存储在变量中
【发布时间】:2016-02-22 13:59:09
【问题描述】:

我有一个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,当我尝试实例化模型类时,它们都会导致类型分配错误。

【问题讨论】:

    标签: swift generics swift2


    【解决方案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 } )
    

    【讨论】:

    • 非常感谢,我们刚刚开始使用 Swift 的泛型。
    猜你喜欢
    • 2018-09-23
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多