Guest User

Untitled

a guest
May 21st, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1. // swift 4.1
  2.  
  3. protocol AnyEquatable {
  4. func isEqual(to value: Any) -> Bool
  5. }
  6.  
  7. extension AnyEquatable where Self: Equatable {
  8. func isEqual(to value: Any) -> Bool {
  9. guard let value = value as? Self else {
  10. return false
  11. }
  12.  
  13. return value == self
  14. }
  15. }
  16.  
  17. extension Int: AnyEquatable {}
  18. extension Bool: AnyEquatable {}
  19. extension Double: AnyEquatable {}
  20. extension String: AnyEquatable {}
  21.  
  22. extension AnyHashable: AnyEquatable {
  23. func isEqual(to value: Any) -> Bool {
  24. guard let base = base as? AnyEquatable else {
  25. return false
  26. }
  27.  
  28. return base.isEqual(to: value)
  29. }
  30. }
  31.  
  32. extension Array: AnyEquatable where Element: Any {
  33. func isEqual(to value: Any) -> Bool {
  34. guard let value = value as? [Element], value.startIndex == startIndex, value.endIndex == endIndex else {
  35. return false
  36. }
  37.  
  38. var i = startIndex
  39.  
  40. while i != endIndex {
  41. guard let lhv = self[i] as? AnyEquatable, lhv.isEqual(to: value[i]) else {
  42. return false
  43. }
  44.  
  45. i = index(after: i)
  46. }
  47.  
  48. return true
  49. }
  50. }
  51.  
  52. extension Dictionary: AnyEquatable where Value: Any {
  53. func isEqual(to value: Any) -> Bool {
  54. guard let value = value as? [Key: Value], value.keys == keys else {
  55. return false
  56. }
  57.  
  58. for key in keys {
  59. switch (self[key], value[key]) {
  60. case (.none, .none):
  61. continue
  62.  
  63. case let (.some(lhv as AnyEquatable), .some(rhv)):
  64. guard lhv.isEqual(to: rhv) else {
  65. return false
  66. }
  67.  
  68. default:
  69. return false
  70. }
  71. }
  72.  
  73. return true
  74. }
  75. }
  76.  
  77. let v1: [Int: Any] = [0: AnyHashable(2)]
  78. let v2: [Int: Any] = [0: 2]
  79.  
  80. print(v1.isEqual(to: v2))
Add Comment
Please, Sign In to add comment