Мне пришлось использовать стирание типа в Swift несколько раз, однако он всегда включал общий протокол. В этом случае он включает как общее перечисление , так и и общий протокол, и я в тупике.Быстрое стирание типа с общим перечислением и общим протоколом
Вот мое общее перечисление и общий протокол с необходимым расширением:
enum UIState<T> {
case Loading
case Success([T])
case Failure(ErrorType)
}
protocol ModelsDelegate: class {
associatedtype Model
var state: UIState<[Model]> { get set }
}
extension ModelsDelegate {
func getNewState(state: UIState<[Model]>) -> UIState<[Model]> {
return state
}
func setNewState(models: UIState<[Model]>) {
state = models
}
}
А вот это мой типа стерта общим класс:
class AnyModelsDelegate<T>: ModelsDelegate {
var state: UIState<[T]> {
get { return _getNewState(UIState<[T]>) } // Error #1
set { _setNewState(newValue) }
}
private let _getNewState: ((UIState<[T]>) -> UIState<[T]>)
private let _setNewState: (UIState<[T]> -> Void)
required init<U: ModelsDelegate where U.Model == T>(_ models: U) {
_getNewState = models.getNewState
_setNewState = models.setNewState
}
}
Я получаю следующие ошибки (они отмеченные в примере кода):
Ошибка № 1:
Cannot convert value of type '(UIState<[T]>).Type' (aka 'UIState<Array<T>>.Type') to expected argument type 'UIState<[_]>' (aka 'UIState<Array<_>>')
Я работаю над этим некоторое время, и на этом коде было довольно много вариаций, которые «почти сработали». Ошибка всегда имеет отношение к геттеру.
Вы пропускание типа к способу, который принимает экземпляр этого типа – dan
I 'm немного запутался, почему ваша функция 'getNewState' принимает вход, конечно, это должен быть'() -> UIState <[Model]> '? Хотя, если ваши функции 'getNewState' и' setNewState' существуют только для пересылки получения и настройки для стирания вашего типа, они не нужны, поскольку вы можете сделать это непосредственно в стирании типа с помощью замыканий (то есть '_getNewState = {models. state} '&' _setNewState = {models.state = $ 0} '). – Hamish
Да, я тоже немного смущен :). Он принимает ввод, потому что изначально я получал ошибки, когда он не принимал ввода. Позвольте мне попробовать рефакторинг. – damianesteban