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