2015-09-07 64 views
0

我在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

你想的'init'这需要'Any',使一个'enum'为根据实际类型相关联的价值?所以'LegalArgs(“你好”)'会导致'LegalArgs.AsString(“你好”)'? – Qbyte

+0

不,反过来 - 我有LegalArgs.AsString(“你好”),我需要一个字符串?。这对于特定的成员来说很简单,但当我需要在所有不同类型的案例中共享相同的逻辑时,这个问题会更加棘手。 – Puppy

回答

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 
+0

这并不能完全解决我的问题......但它几乎肯定足够接近。我将在下一次在此代码库上工作时尝试此操作。 – Puppy

+0

@Puppy为了解决问题应该改变什么? – Qbyte

+0

那么,我仍然需要手动保持asType 与底层枚举同步,并且对于每个需要此函数的枚举,我都需要自己重写它,而不是使用语言工具来完成它。我的意思是,该工具可能不存在,所以这是最好的解决方案,但它的原理并不像原来那么好。 – Puppy