我在Swift中得到了一个枚举。它有点像
enum LegalArgs {
case AsString(String)
case AsBool(Bool)
... etc
}
我想通过类型有条件地访问此枚举。所以,如果我有一个LegalArgs的实例,我可以通过T并获得一个T?如果实例属于那种类型。否则,我将不得不为不同的情况复制一堆代码。
我目前的代码看起来有点像这样:
String? maybeAsString(arg: LegalArgs) {
switch arg {
case .AsString(let str):
return str;
default:
return nil;
}
}
问题是我必须为枚举中的每个案例复制此函数。
答案 0 :(得分:1)
您可以使用通用asType
功能:
enum LegalArgs {
case AsString(String)
case AsBool(Bool)
case AsNumber(Int)
func asType<T>(type: T.Type) -> T? {
switch self {
case AsString(let str): return str as? T
case AsBool(let bol): return bol as? T
case AsNumber(let num): return num as? T
}
}
}
// usage
LegalArgs.AsBool(true).asType(Bool.self) // true
LegalArgs.AsBool(true).asType(String.self) // nil