枚举方法返回动态类型

时间:2017-01-08 01:38:30

标签: swift enums

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

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

enum Foo {
    case option1
    case option2

    func createKey() -> [String] {
        switch self {
        case .option1: return ["scenario1"]
        case .option2: return ["scenario2"]
        }
    }
}

一旦我拥有了这些值,我需要将它们转换为适当的类型才能使用它们。现在我正在使用if-statements手动完成它,但如果我能以某种方式在枚举中创建一个方法来返回正确的类型,它会减少很多代码。我目前的代码:

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 }
}

这可能吗?

1 个答案:

答案 0 :(得分:0)

我认为问题的核心是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必须是类型;它不能是隐藏自身内部类型的变量。但这正是你要求做的事情。