2017-01-08 4 views
0

У меня есть перечисление, и я бы хотел создать метод для возврата другого типа для каждого случая.enum метод возвращает динамический тип

Например, у меня есть словарь [String: Any]. Для обработки значений я использую перечисление, чтобы создать массив ключей:

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

Возможно ли это?

+0

Но тогда что должно быть «rawValue» статически напечатано как? Тип, возвращаемый вашим гипотетическим методом 'option.getType()', неизвестен до выполнения. – Hamish

+0

Я не понимаю, что это связано с перечислением. В ваших случаях различаются значения Int и String. – matt

+0

@Hamish: 'rawValue' в моем исходном перечислении - это' String', используемый для других purpsoses. –

ответ

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 должен быть типа; он не может быть переменной, скрывающей тип внутри себя. Но именно это, по сути, вы просите.

+0

Хорошо, понял. Спасибо за отличное объяснение! Жаль, что мой код выглядел бы немного более чистым. –

Смежные вопросы