在Swift中使用泛型返回不同的约束类型

时间:2016-01-09 12:04:40

标签: ios swift generics

我想定义一个函数,给一些参数返回一个UITableViewCell的具体实现,如下所示:

func cellClassFromCellType<T: UITableViewCell>(cellType: CellType, atIndexPath: NSIndexPath) -> T.Type {
    switch cellType
    case someEnum: return NotificationCell
    default: return UITableViewCell
}

所以我可以这样做:

let cellType = cellClassFromCellType(.Test, atIndexPath: NSIndexPath())
let cell = cellType(style: UITableViewCellStyle.Default, reuseIdentifier: "")

但是通过上面的实现,我得到以下错误:

Cannot convert return expression of type 'NotificationCell.Type' to return type 'T.Type'

我甚至不确定上述实现方向是否正确,因此任何输入都会有所帮助。

最好我也想在protocol中定义这个函数,所以也非常感谢定义这样一个协议的一些帮助。

1 个答案:

答案 0 :(得分:1)

Swift是一种静态类型语言,因此必须在编译时修复所有类型。函数不能根据在运行时确定的因素动态地从一种类型转换到另一种类型。 Source

由于您已经询问了协议,Swift不支持通用参数化协议(但是),但您可以阅读here有关可能的解决方法。