AnyConvertible.swift 2.7 KB

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