是否可以在Swift中隐式地将枚举转换为字符串?
作为一个具体示例,请考虑以下表示UITableViewCell
标识符的枚举:
enum TableViewCellIdentifier : String {
case Basic = "Cell"
}
然后我们可能想要使用该标识符来解除细胞...
let cell = tableView.dequeueReusableCellWithIdentifier(TableViewCellIdentifier.Basic.rawValue, forIndexPath: indexPath)
我们使用此模式的任何地方都需要使用.rawValue
,这一点尤其令人讨厌。
是否有任何协议可以使枚举符合以获得此功能?我试过看StringLiteralConvertible
,但这是为了构造一个值而不是提取它。
答案 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
的每个实例