AnyConvertible.swift 2.6 KB

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