2016-10-21 3 views
0

Fondamentalement, le problème est la partie RawRepresentable du code, je dois être en mesure d'obtenir la valeur de celui-ci, mais parce que j'ai besoin de convertir en un protocole, il ne me permet pas d'utiliser rawValue. Une solution de contournement pour cela?Passer au protocole et utiliser la valeur?

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() 

      // Compile error here 
      case let rawRepresentable as RawRepresentable: 
       result[label] = rawRepresentable.rawValue 

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

     return result 
    } 
} 
+1

Vous pourriez être en mesure d'ajouter une méthode d'extension sur RawRepresentable qui prend le dictionnaire comme inout et met rawValue en elle. – zneak

Répondre

1

Je pense que cela revient à des problèmes d'utilisation d'un type associé en dehors de l'énumération.

Je l'ai fixé comme ceci:

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

génial merci cela fonctionne, sauf si je trouve une solution plus propre sans la nouvelle extension, je vais marquer cela comme réponse – aryaxt