Перечисляет связанные значения и дженерики - PullRequest
0 голосов
/ 29 октября 2018

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

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 Ответ

0 голосов
/ 29 октября 2018

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

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

let test = inital as! T

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

Причина, по которой T относится к типу ListTableViewState, является производной от

tableViewState = loadInitialState(inital: test1)

Здесь tableViewState имеет тип ListTableViewState

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

Решение:

Вы можете получить доступ к associated value из enum case, используя switch statement, т.е.

func loadInitialState<T>(inital: InitialState) -> T?  {
    switch inital {
    case .listTableView(let test):
        return test as? T
    }
    return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...