Для изучения обобщенных шаблонов 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()
считается неправильным, но почему?
И какая будет правильная реализация?