Дженерик Пикер Просмотреть в Swift - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь создать универсальный 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 .

Как решить эту проблему?

1 Ответ

0 голосов
/ 05 января 2019

Any и генерики не очень хорошо работают вместе. Сделайте GenericPickerManager также универсальным:

class GenericPickerManager<T> {
    static func showPicker(_ dataSource: GenericPickerDataSource<T>) {}

    static func hidePicker() {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...