【发布时间】:2018-07-02 15:40:32
【问题描述】:
为了学习 Swift 泛型,我编写了一个函数来创建一个 tableView 数据源,即一个 2 维(节、行)元素数组。 元素类型应该是通用的,并且创建的数据源应该使用元素的唯一值进行初始化。
我声明了可能的元素类型采用的协议:
protocol UniqueInit {
associatedtype T
static func uniqueInit() -> T
}
还有dataSource 函数。
这里,nrRowsInSection 是一个可变参数:给定的参数数量定义了部分的数量,而参数的值定义了相应部分中的行数。
static func dataSource<T: UniqueInit>(nrRowsInSection: Int...) -> [[T]] {
var result: [[T]] = []
for nrRows in nrRowsInSection {
var row: [T] = []
for _ in 0 ..< nrRows {
row.append(T.uniqueInit())
}
result.append(row)
}
return result
}
此函数无法编译。声明
row.append(T.uniqueInit())
给出错误:
Argument type 'T.T' does not conform to expected type 'UniqueInit'
Cannot convert value of type 'T.T' (associated type of protocol 'UniqueInit') to expected argument type 'T' (generic parameter of static method 'dataSource(nrRowsInSection:)')
显然,static func uniqueInit() 被认为是错误的,但为什么呢?
正确的实现方式是什么?
【问题讨论】:
标签: swift generics associated-types