2016-10-21 4 views
0

В основном проблема заключается в RawReпредставляемой части кода, мне нужно иметь возможность получить ее значение, но поскольку мне нужно использовать протокол, это не позволяет мне использовать rawValue. Любое обходное решение для этого?Кастинг для протокола и использование значения?

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

Вы могли бы добавить метод расширения RawRepresentable, который принимает словарь как INOUT и помещает RawValue в нем. – zneak

ответ

1

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

Я исправил это так:

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