Я пытаюсь создать универсальный UI Picker, используя Generics. В рамках моей реализации я создал объект GenericRow для отображения в UIPicker. Но я столкнулся с некоторой проблемой. Он может быть базовым, но не может выяснить.
struct GenericRow<T> {
let type: T
let title: String
public init(type: T, title: String) {
self.type = type
self.title = title
}
}
Следующим является GenericDataSource для обработки UIPickerViewDataSource и UIPickerViewDelegate.
class GenericPickerDataSource<T>: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
public var items: [GenericRow<T>]
public init(withItems items: [GenericRow<T>]) {
self.items = items
}
public func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return items.count
}
public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return items[row].title
}
}
Затем я создаю менеджера для управления функциями выбора / скрытия. Пожалуйста, обратите внимание, что это также является общим и не знает ничего о типе GenericRow.
class GenericPickerManager {
static func showPicker(_ dataSource: GenericPickerDataSource<Any>) {}
static func hidePicker() {}
}
Пример ввода:
struct State {
let identifier: String
let name: String
}
let CA = State(identifier: "CA", name: "California")
let CLT = State(identifier: "CLT", name: "Charlotte")
let IL = State(identifier: "IL", name: "Illinois")
let states = [CA, CLT, IL]
let items = states.map {
GenericRow<State>(type: $0, title: $0.name)
}
let dataSource = GenericPickerDataSource(withItems: items)
Теперь, когда я пытаюсь показать сборщика из моего класса, я получаю сообщение об ошибке.
GenericPickerManager.showPicker(dataSource)
Невозможно преобразовать значение типа GenericPickerDataSource в
ожидаемый тип аргумента GenericPickerDataSource .
Как решить эту проблему?