Как я могу найти дочернего элемента c в списке non-generi c в swift? - PullRequest
2 голосов
/ 13 января 2020

У меня проблемы с дженериками.

Следующий код компилируется просто отлично, но строка if let item = row as? SelectionInputControl<Any> { не работает так, как я себе представлял.

У меня есть подкласс BasicInputView, назовем его CountryInputView, который помещает объект SelectionInputControl<Country> (Country в данном случае enum) в rows, но ни один не делает SelectionInputControl<Country> разрешить SelectionInputControl<Any>, и я не могу использовать SelectionInputControl (потому что это не скомпилируется).

Как я могу это исправить? Любая помощь будет высоко ценится.

class BasicInputView: UIView {

    var popoverPresenter: (UIViewController & UIPopoverPresentationControllerDelegate)? {
        didSet {
            for row in rows {
                if let item = row as? SelectionInputControl<Any> {
                    item.popoverPresenter = popoverPresenter
                }
            }
        }
    }
    private var rows = [BasicInputControl]()
}

class SelectionInputControl<T>: BasicInputControl {

    var enumValues = [T]()
    private var currentValue: T?

    var popoverPresenter: (UIViewController & UIPopoverPresentationControllerDelegate)?

}

1 Ответ

1 голос
/ 13 января 2020

Вы не можете привести SelectionInputControl<Country> к SelectionInputControl<Any>, потому что дженерики в Swift не являются вариантами, за исключением массивов. : (

Одним из способов является введение другого протокола, PopoverPresentable:

protocol PopoverPresentable {
    var popoverPresenter: (UIViewController & UIPopoverPresentationControllerDelegate)? { get set }
}

Соответствие SelectionInputControl этому протоколу:

extension SelectionInputControl : PopoverPresentable {}

Теперь вы можете использовать вместо PopoverPresentable:

if let item = row as? PopoverPresentable {
    item.popoverPresenter = popoverPresenter
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...