2016-10-21 3 views

答えて

1

これは、列挙型の外部でassociatedTypeを使用しようとすると問題になると思います。

私はこのようにそれを固定:あなたがINOUTとして辞書を取り、それにrawValueを置くRawRepresentable上の拡張メソッドを追加することができるかもしれません

public protocol Serializable { 
    func dictionary() -> [String: Any] 
} 

extension Serializable { 
    func dictionary() -> [String: Any] { 
     var result = [String: Any]() 
     let mirror = Mirror(reflecting: self) 

     for child in mirror.children { 
      guard let label = child.label else { continue } 

      switch child.value { 
      case let serializable as Serializable: 
       result[label] = serializable.dictionary() 

      case let rawRepresentable as RawRepresentable: 
       let value = rawRepresentable.getValueAsAny() 
       result[label] = value 

      default: 
       result[label] = child.value 
      } 
     } 

     return result 
    } 
} 

extension RawRepresentable { 
    func getValueAsAny() -> Any { 
     return rawValue as Any 
    } 
} 
+0

新しい拡張機能がないクリーナーソリューションが見つからない限り、私はこれを答えとしてマークします – aryaxt

関連する問題