You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.2 KiB

  1. //
  2. // DictionaryTransform.swift
  3. // ObjectMapper
  4. //
  5. // Created by Milen Halachev on 7/20/16.
  6. // Copyright © 2016 hearst. All rights reserved.
  7. //
  8. import Foundation
  9. ///Transforms [String: AnyObject] <-> [Key: Value] where Key is RawRepresentable as String, Value is Mappable
  10. public struct DictionaryTransform<Key, Value>: TransformType where Key: Hashable, Key: RawRepresentable, Key.RawValue == String, Value: Mappable {
  11. public init() {
  12. }
  13. public func transformFromJSON(_ value: Any?) -> [Key: Value]? {
  14. guard let json = value as? [String: Any] else {
  15. return nil
  16. }
  17. let result = json.reduce([:]) { (result, element) -> [Key: Value] in
  18. guard
  19. let key = Key(rawValue: element.0),
  20. let valueJSON = element.1 as? [String: Any],
  21. let value = Value(JSON: valueJSON)
  22. else {
  23. return result
  24. }
  25. var result = result
  26. result[key] = value
  27. return result
  28. }
  29. return result
  30. }
  31. public func transformToJSON(_ value: [Key: Value]?) -> Any? {
  32. let result = value?.reduce([:]) { (result, element) -> [String: Any] in
  33. let key = element.0.rawValue
  34. let value = element.1.toJSON()
  35. var result = result
  36. result[key] = value
  37. return result
  38. }
  39. return result
  40. }
  41. }