是否可以隐式地将枚举转换为字符串? (SWIFT)

时间:2015-10-08 16:39:20

标签: swift casting enums

是否可以在Swift中隐式地将枚举转换为字符串?

作为一个具体示例,请考虑以下表示UITableViewCell标识符的枚举:

enum TableViewCellIdentifier : String {
    case Basic = "Cell"
}

然后我们可能想要使用该标识符来解除细胞...

let cell = tableView.dequeueReusableCellWithIdentifier(TableViewCellIdentifier.Basic.rawValue, forIndexPath: indexPath)

我们使用此模式的任何地方都需要使用.rawValue,这一点尤其令人讨厌。

是否有任何协议可以使枚举符合以获得此功能?我试过看StringLiteralConvertible,但这是为了构造一个值而不是提取它。

2 个答案:

答案 0 :(得分:1)

在WWDC 2015年会议" Swift in Practice"主持人建议使用扩展名来实现此目的

enum TableViewCellIdentifier : String {
  case Basic = "Cell"
}

extension UITableView {
   func dequeueReusableCellWithTableViewCellIdentifier(identifier: TableViewCellIdentifier, forIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     return self.dequeueReusableCellWithIdentifier(identifier.rawValue, forIndexPath:indexPath)
   }
}

然后你可以调用函数

let cell = tableView.dequeueReusableCellWithTableViewCellIdentifier(.Basic, forIndexPath: indexPath)

答案 1 :(得分:1)

我会对另一个答案略有不同。

首先,我将声明协议和协议扩展

protocol TableViewRowReturnable {
    typealias RowIdentifier: RawRepresentable
}

extension TableViewRowReturnable where Self: UITableViewDataSource, RowIdentifier.RawValue == String {
    func dequeueReuesableCellWithIdentfier(identifier: RowIdentifier, fromTableView tableView: UITableView, forIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        return tableView.dequeueReusableCellWithIdentifier(identifier.rawValue, forIndexPath: indexPath)
    }
}

我为实施类型为UITableViewDatasource的情况提供了自定义实现,因为该类型实际上是返回该行的类型。

现在通过提供包含单元格标识符的枚举来使DataSource符合协议:

extension ViewController: UITableViewDataSource, TableViewRowReturnable {

    enum RowIdentifier: String {
        case RedCell = "RedCell"
        case BlueCell = "BlueCell"
    }


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell

        switch (indexPath.row % 2) {
        case 0:
            cell = dequeueReuesableCellWithIdentfier(.RedCell, fromTableView: tableView, forIndexPath: indexPath)
        default:
            cell = dequeueReuesableCellWithIdentfier(.BlueCell, fromTableView: tableView, forIndexPath: indexPath)
        }

        cell.textLabel?.text = "Your value here"

        return cell
    }
}

这样可以使用包含在使用它的函数中的单元格标识符来保存枚举。此外,默认实现仅适用于声明为实现协议的类型,而不是将其添加到UITableView的每个实例