AnyConvertible.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // LoopFollow
  2. // AnyConvertible.swift
  3. // Created by Jon Fawcett on 2020-06-05.
  4. import Foundation
  5. /// A type that can be converted to/from Any
  6. protocol AnyConvertible {
  7. func toAny() -> Any
  8. static func fromAny(_ anyValue: Any) -> Self?
  9. }
  10. // common type implementations
  11. extension Bool: AnyConvertible {
  12. func toAny() -> Any {
  13. return self
  14. }
  15. static func fromAny(_ anyValue: Any) -> Bool? {
  16. return anyValue as? Bool
  17. }
  18. }
  19. extension String: AnyConvertible {
  20. func toAny() -> Any {
  21. return self
  22. }
  23. static func fromAny(_ anyValue: Any) -> String? {
  24. return anyValue as? String
  25. }
  26. }
  27. extension Int: AnyConvertible {
  28. func toAny() -> Any {
  29. return self
  30. }
  31. static func fromAny(_ anyValue: Any) -> Int? {
  32. return anyValue as? Int
  33. }
  34. }
  35. extension Float: AnyConvertible {
  36. func toAny() -> Any {
  37. return self
  38. }
  39. static func fromAny(_ anyValue: Any) -> Float? {
  40. return anyValue as? Float
  41. }
  42. }
  43. extension Double: AnyConvertible {
  44. func toAny() -> Any {
  45. return self
  46. }
  47. static func fromAny(_ anyValue: Any) -> Double? {
  48. return anyValue as? Double
  49. }
  50. }
  51. extension Date: AnyConvertible {
  52. func toAny() -> Any {
  53. return self
  54. }
  55. static func fromAny(_ anyValue: Any) -> Date? {
  56. return anyValue as? Date
  57. }
  58. }
  59. extension Data: AnyConvertible {
  60. func toAny() -> Any {
  61. return self
  62. }
  63. static func fromAny(_ anyValue: Any) -> Data? {
  64. return anyValue as? Data
  65. }
  66. }
  67. extension UUID: AnyConvertible {
  68. func toAny() -> Any {
  69. return uuidString
  70. }
  71. static func fromAny(_ anyValue: Any) -> UUID? {
  72. guard let uuidString = anyValue as? String else {
  73. return nil
  74. }
  75. return UUID(uuidString: uuidString)
  76. }
  77. }
  78. // extension Array: AnyConvertible {
  79. // func toAny() -> Any {
  80. // return self
  81. // }
  82. //
  83. // static func fromAny(_ anyValue: Any) -> Array? {
  84. // return anyValue as? Array
  85. // }
  86. // }
  87. extension Array: AnyConvertible where Element: AnyConvertible {
  88. func toAny() -> Any {
  89. return map { $0.toAny() }
  90. }
  91. static func fromAny(_ anyValue: Any) -> Array? {
  92. return (anyValue as? Array)?.compactMap { Element.fromAny($0) }
  93. }
  94. }
  95. extension Optional: AnyConvertible where Wrapped: AnyConvertible {
  96. func toAny() -> Any {
  97. switch self {
  98. case let .some(value):
  99. return value.toAny()
  100. case .none:
  101. return self as Any
  102. }
  103. }
  104. static func fromAny(_ anyValue: Any) -> Wrapped?? {
  105. return Wrapped.fromAny(anyValue)
  106. }
  107. }