Swift универсальный без силы развернуть вниз - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь создать некоторый общий код на основе:

protocol ViewModelsCreator {
    associatedtype T: EditItemViewModelType
    func editItemViewModel<T>() -> T
}

class PlacesListViewModel: ViewModelsCreator {
    typealias T = EditPlaceViewModel
    func editItemViewModel<T>() -> T {
        return EditPlaceViewModel()
    }
}

class EditPlaceViewModel: EditItemViewModelType {}

protocol EditItemViewModelType {}

На игровой площадке отображается ошибка:

не может преобразовать возвращаемое выражение типа 'EditPlaceViewModel' в тип возвращаемого значения 'T'

и предложите использовать

return EditPlaceViewModel() as! T

Есть ли какое-либо решение, позволяющее избежать этого (как! T) принудительного развертывания кода?Я думаю, что компилятор должен выяснить, что EditPlaceViewModel является EditItemViewModelType и должен удовлетворять этому универсальному.

1 Ответ

0 голосов
/ 13 мая 2018

Вам необходимо удалить <T> в протоколе ViewModelsCreator и класс PlacesListViewModel.

protocol ViewModelsCreator {
    associatedtype T: EditItemViewModelType
    func editItemViewModel() -> T
}

class PlacesListViewModel: ViewModelsCreator {
    typealias T = EditPlaceViewModel
    func editItemViewModel() -> T {
        return EditPlaceViewModel()
    }
}

Вы также можете удалить typealias и заменить -> T на -> EditPlaceViewModel вPlacesListViewModel класс.Это работает в любом случае, но это более явно.

class PlacesListViewModel: ViewModelsCreator {
    func editItemViewModel() -> EditPlaceViewModel {
        return EditPlaceViewModel()
    }
}
...