Skip to content

Instantly share code, notes, and snippets.

@nikolaykasyanov
Last active September 27, 2019 14:53
Show Gist options
  • Save nikolaykasyanov/28409d9b54074a404eea62cb83d50082 to your computer and use it in GitHub Desktop.
Save nikolaykasyanov/28409d9b54074a404eea62cb83d50082 to your computer and use it in GitHub Desktop.
A property wrapper that creates subject-backed observers (RxSwift)
class ViewModel {
init() {
// accessing underlying subject:
$buttonTapped
.asObservable()
...
}
// look ma, no explicit subject property
@SubjectBackedObserver(PublishSubject.init)
var buttonTapped: AnyObserver<Void>
}
@propertyWrapper
struct SubjectBackedObserver<Subject: SubjectType>: ObservableConvertibleType {
private let subject: Subject
private let typeErasingObserver: AnyObserver<Subject.Observer.Element>
init(_ factory: () -> Subject) {
let subject = factory()
typeErasingObserver = AnyObserver<Subject.Observer.Element> { event in
let observer: Subject.Observer = subject.asObserver()
observer.on(event)
}
self.subject = subject
}
func asObservable() -> Observable<Subject.Element> {
subject.asObservable()
}
var projectedValue: Self {
self
}
var wrappedValue: AnyObserver<Subject.Observer.Element> {
typeErasingObserver
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment