Перечисляет связанные значения и дженерики

У меня есть перечисление как это, оно содержит различные начальные состояния:

enum InitialState {
    case listTableView(ListTableViewState)   
}

Я хочу использовать их так:

var tableViewState: ListTableViewState?

let test = ListTableViewState(group: .large, statIntervalBase: StatIntervalBaseModel(stat: "ppc", interval: "24h", base: "usd"), order: .ascending, searchParameter: "", quantityStats: .six)
let test1 = InitialState.listTableView(test)
tableViewState = loadInitialState(inital: test1)

Это общая функция, которую я использую:

func loadInitialState<T>(inital: InitialState) -> T  {
    let test = inital as! T
    print(test)
    return test
}

Я получаю эту ошибку, конечно:

Не удалось привести значение типа "InitialState" (0x109466da0) к "ListTableViewState" (0x1094912b0).

Как я могу получить к нему доступ в общей функции loadInitialState?

1 ответ

Решение

Причина исключения:

В приведенном ниже коде

let test = inital as! T

Вы кастуете InitialState введите в T, И согласно вашему коду тип универсального типа T является ListTableViewState,

Причина T имеет тип ListTableViewState происходит от,

tableViewState = loadInitialState(inital: test1)

Вот, tableViewState имеет тип ListTableViewState

По этой причине приведение типов к другому типу завершается неудачно и вызывает исключение.

Решение:

Вы можете получить доступ к associated value из enumcase с использованием switch statement т.е.

func loadInitialState<T>(inital: InitialState) -> T?  {
    switch inital {
    case .listTableView(let test):
        return test as? T
    }
    return nil
}
Другие вопросы по тегам