Reactive.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // Reactive.swift
  3. // RxSwift
  4. //
  5. // Created by Yury Korolev on 5/2/16.
  6. // Copyright © 2016 Krunoslav Zaher. All rights reserved.
  7. //
  8. /**
  9. Use `Reactive` proxy as customization point for constrained protocol extensions.
  10. General pattern would be:
  11. // 1. Extend Reactive protocol with constrain on Base
  12. // Read as: Reactive Extension where Base is a SomeType
  13. extension Reactive where Base: SomeType {
  14. // 2. Put any specific reactive extension for SomeType here
  15. }
  16. With this approach we can have more specialized methods and properties using
  17. `Base` and not just specialized on common base type.
  18. */
  19. public struct Reactive<Base> {
  20. /// Base object to extend.
  21. public let base: Base
  22. /// Creates extensions with base object.
  23. ///
  24. /// - parameter base: Base object.
  25. public init(_ base: Base) {
  26. self.base = base
  27. }
  28. }
  29. /// A type that has reactive extensions.
  30. public protocol ReactiveCompatible {
  31. /// Extended type
  32. associatedtype ReactiveBase
  33. @available(*, deprecated, renamed: "ReactiveBase")
  34. typealias CompatibleType = ReactiveBase
  35. /// Reactive extensions.
  36. static var rx: Reactive<ReactiveBase>.Type { get set }
  37. /// Reactive extensions.
  38. var rx: Reactive<ReactiveBase> { get set }
  39. }
  40. extension ReactiveCompatible {
  41. /// Reactive extensions.
  42. public static var rx: Reactive<Self>.Type {
  43. get {
  44. return Reactive<Self>.self
  45. }
  46. // swiftlint:disable:next unused_setter_value
  47. set {
  48. // this enables using Reactive to "mutate" base type
  49. }
  50. }
  51. /// Reactive extensions.
  52. public var rx: Reactive<Self> {
  53. get {
  54. return Reactive(self)
  55. }
  56. // swiftlint:disable:next unused_setter_value
  57. set {
  58. // this enables using Reactive to "mutate" base object
  59. }
  60. }
  61. }
  62. import class Foundation.NSObject
  63. /// Extend NSObject with `rx` proxy.
  64. extension NSObject: ReactiveCompatible { }