1

我有一个这样的枚举,它包含不同的初始状态:

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

4

1 回答 1

2

例外原因:

在下面的代码中,

let test = inital as! T

您正在将InitialState类型转换为T. 根据您的代码,泛型类型的类型TListTableViewState.

原因T是类型ListTableViewState来源于,

tableViewState = loadInitialState(inital: test1)

这里,tableViewState是类型ListTableViewState

这就是类型转换为不同类型失败并引发异常的原因。

解决方案:

您可以使用访问associated value,即enum caseswitch statement

func loadInitialState<T>(inital: InitialState) -> T?  {
    switch inital {
    case .listTableView(let test):
        return test as? T
    }
    return nil
}
于 2018-10-29T12:44:41.133 回答