2016-11-10 2 views
1

поэтому я функцию, которая получает Any и проверяет, является ли любое это перечисление с помощью отражения:Я хочу вернуть RawValue RawRepresentable в качестве любой, но я только получить его как любой

func extractRawValue(subject: Any) throws -> Any { 
    let mirror = Mirror(reflecting: subject) 

    guard let displayStyle = mirror.displayStyle, 
     case .`enum` = displayStyle else { 
      throw Errors.NoEnum 
    } 

    // And from here I don't know how to go any further... 
    // I wish I could do something like this: 
    guard let subject = subject as? RawRepresentable where let rawValue = subject.rawValue as Any else { 
     throw Errors.NoRawRepresenable 
    } 

    return rawValue 
} 

Кто-нибудь знает, как я могу добиться чего-то подобного?

+0

Какой вопрос «защищать пусть subject = subject as? RawRepresentable, где пусть rawValue = subject.rawValue как Any' пытается спросить? Я вижу, что первая часть задает вопрос, является ли эта вещь непонятной, но я не могу себе представить, что должна означать вторая часть. Помогите мне здесь. – matt

+0

Удалось ли вам? Я пытаюсь найти что-то подобное здесь: http://stackoverflow.com/questions/43666118/if-let-any-to-rawrepresentablestring –

ответ

2

Я думаю, что путь Swifty, чтобы сделать это, чтобы использовать протокол для перечислений, которые вы хотите использовать:

protocol ValueAsAnyable { 
    func valueAsAny() -> Any 
} 

extension ValueAsAnyable where Self: RawRepresentable { 
    func valueAsAny() -> Any { 
     return rawValue as Any 
    } 
} 

func extractRawValue(subject: Any) throws -> Any { 
    let mirror = Mirror(reflecting: subject) 

    guard let displayStyle = mirror.displayStyle, 
     case .`enum` = displayStyle else { 
      throw Errors.NoEnum 
    } 
    guard let anyable = subject as? ValueAsAnyable else { 
     throw Errors.NoRawRepresentable 
    } 
    return anyable.valueAsAny() 
} 

let subject: Any = TestEnum.test 
let thing = try? extractRawValue(subject: subject) //prints "test" 

Это позволит вам делать то, что вам нужно, но сохранить безопасность типа.

+1

Ах да, я забыл сказать, но все дело в том, что не нужно было сделай это. – Evert

+0

Я добавил расширение, которое будет автоматически реализовывать его, поэтому просто добавьте его в объявление enum. AFAIK, который так же близок, насколько вы можете получить, пока Свифт не добавит больше динамизма или лучшего отражения. – PeejWeej