2016-11-10 10 views
1

としてそれを受け取るので、私はAnyを受け取る機能を持っており、どれがリフレクションを使用して列挙されていないか調べます:私がどれとしてRawRepresentableのrawValueを返すようにしたいが、私は唯一のどれ

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

どのような質問が 'guard let subject = subject asですか? RawRepresentableここで、rawValue = subject.rawValueをAny'として聞かせようとしていますか?私は、最初の部分は、このことがRaw表現であるかどうかを尋ねるが、2番目の部分が意味すると思われるものを想像することはできない。ここで助けてください。 – 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

関連する問題