Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
import Foundation
final class Sample: NSObject {
@objc dynamic var name: String = ""
class MyObj: NSObject {
@objc dynamic var test: String = ""
extension NSObjectProtocol where Self: NSObject {
func observe<A, Other>(_ keyPath: KeyPath<Self,A>,
writeTo other: Other,
_ otherKeyPath: ReferenceWritableKeyPath<Other,A>)
-> NSKeyValueObservation
where A: Equatable, Other: NSObjectProtocol {
return self.observe(keyPath, options: .new) { _, change in
guard let newValue = change.newValue,
other[keyPath: otherKeyPath] != newValue else {
return // no change
other[keyPath: otherKeyPath] = newValue
func bind<A, Other>(_ keyPath: ReferenceWritableKeyPath<Self,A>,
to other: Other,
_ otherKeyPath: ReferenceWritableKeyPath<Other,A>)
-> (NSKeyValueObservation, NSKeyValueObservation)
where A: Equatable, Other: NSObject
let one = self.observe(keyPath, writeTo: other, otherKeyPath)
let two = other.observe(otherKeyPath, writeTo: self, keyPath)
return (one,two)
let sample = Sample()
let other = MyObj()
let observation = sample.bind(\, to: other, \.test) = "NEW"
other.test = "HI"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment