枚举关联值和泛型
Enums associated values and generics
我有一个这样的枚举,它包含不同的初始状态:
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
}
我当然会遇到这个错误:
Could not cast value of type 'InitialState' (0x109466da0) to
'ListTableViewState' (0x1094912b0).
如何在通用函数 loadInitialState
中访问它?
异常原因:
在下面的代码中,
let test = inital as! T
您正在将 InitialState
类型转换为 T
。根据您的代码,泛型 T
的类型是 ListTableViewState
.
T
属于 ListTableViewState
类型的原因来自
tableViewState = loadInitialState(inital: test1)
这里,tableViewState
的类型是ListTableViewState
这就是类型转换为不同类型失败并抛出异常的原因。
解法:
您可以使用 switch statement
访问 enum
case
的 associated value
,即
func loadInitialState<T>(inital: InitialState) -> T? {
switch inital {
case .listTableView(let test):
return test as? T
}
return nil
}
我有一个这样的枚举,它包含不同的初始状态:
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
}
我当然会遇到这个错误:
Could not cast value of type 'InitialState' (0x109466da0) to 'ListTableViewState' (0x1094912b0).
如何在通用函数 loadInitialState
中访问它?
异常原因:
在下面的代码中,
let test = inital as! T
您正在将 InitialState
类型转换为 T
。根据您的代码,泛型 T
的类型是 ListTableViewState
.
T
属于 ListTableViewState
类型的原因来自
tableViewState = loadInitialState(inital: test1)
这里,tableViewState
的类型是ListTableViewState
这就是类型转换为不同类型失败并抛出异常的原因。
解法:
您可以使用 switch statement
访问 enum
case
的 associated value
,即
func loadInitialState<T>(inital: InitialState) -> T? {
switch inital {
case .listTableView(let test):
return test as? T
}
return nil
}