Swift 返回动态类型的枚举方法

Swift 返回动态类型的枚举方法,swift,enums,Swift,Enums,我有一个枚举,我想创建一个方法,为每个案例返回不同的类型 例如,我有一本字典[String:Any]。要处理这些值,我将使用枚举创建一个键数组: enum Foo { case option1 case option2 func createKey() -> [String] { switch self { case .option1: return ["scenario1"] case .option2: retu

我有一个枚举,我想创建一个方法,为每个案例返回不同的类型

例如,我有一本字典
[String:Any]
。要处理这些值,我将使用枚举创建一个键数组:

enum Foo {
    case option1
    case option2

    func createKey() -> [String] {
        switch self {
        case .option1: return ["scenario1"]
        case .option2: return ["scenario2"]
        }
    }
}
一旦我有了这些值,我需要将它们转换为适当的类型,以便能够使用它们。现在我正在使用
if语句手动执行此操作
,但是如果我可以在枚举中创建一个方法来返回正确的类型,那么将减少大量代码。我当前的代码:

let origin: [String: Any] = ["scenario2": "someText"]
let option: Foo = .option2

option.createKey().forEach {
    guard let rawValue = origin[$0] else { return }

    switch option {
    case .option1:
        guard let value = rawValue as? Int else { return }
        print("Value is an Int:", value)
    case .option2:
        guard let value = rawValue as? String else { return }
        print("Value is a String:", value)
    }
}
我想要实现的是:

option.createKey().forEach {
    guard let rawValue = origin[$0] as? option.getType() else { return }
}

这有可能吗?

我认为问题的核心是Swift的打字很严格。这意味着类型必须在编译时已知。这显然是合法的:

let s : Any = "howdy"
if let ss = s as? String {
    print(ss)
}
但这是不合法的:

let s : Any = "howdy"
let someType = String.self
if let ss = s as? someType { // *
    print(ss)
}

someType
必须是一个类型;它不能是将类型隐藏在自身内部的变量。但事实上,这正是您要求做的。

那么,
rawValue
静态键入为什么呢?假设的
option.getType()
方法返回的类型直到运行时才知道。我不明白这与枚举有什么关系。在您的情况下不同的是Int和String。@Hamish:我原始枚举中的
rawValue
是一个
字符串,用于其他目的。@matt:示例中的枚举只是一个简化版本,但正如Hamish所说,在运行时之前,类型是未知的。我可能应该删除这个问题。但我的观点是,如果你扔掉枚举,只考虑一下如果让x=y为,你是否可以说
?有些类型包含了变量
,你会立即看到你的整个提议落到了地上。斯威夫特有静态打字。好的,明白了。谢谢你的解释!太糟糕了,这会让我的代码看起来更干净。