Написание Kvo контекста в Swift

В ObjC

static void * const kKVOContext = (void*)&kKVOContext;
[self.superview removeObserver:self.parent forKeyPath:NSStringFromSelector(@selector(contentOffset)) context:kKVOContext];

contentOffset является UIScrollView имущество.

Я написал это в быстрой

стриж

 var kKVOContext = UnsafeMutableRawPointer.allocate(bytes: 4 * 4, alignedTo: 1)
 self.superview?.removeObserver(self.parent!, forKeyPath: NSStringFromSelector(#selector(getter: UIScrollView.contentOffset)), context: &kKVOContext)

Так в Swift это правильный путь или он должен быть другим UnsafeMutableRawPointer? или как я могу написать kKVOContext в быстром?

2 ответа

Этот код Objective C плохой; контекст используется с инициализацией. В Swift он будет инициализирован до 0. В любом случае, контекст для вас. Это произвольное значение, которое позволяет вам указать, почему вы наблюдаете это значение или кто получает это значение, кроме объекта и пути к ключу. Это в основном пользовательский файл cookie. Вот почему этот код не падает; ОС не использует контекст, вы делаете. В Swift вы можете просто передать ссылку на любой ссылочный тип, или вы можете фактически опустить параметр; по умолчанию он равен нулю, если вы его не используете: self.superview?.removeObserver(self.parent!, forKeyPath: "contentOffset")

Вы можете использовать новую функцию Swift 4

// Setting up KVO
 observation = scrollView.observe(\.contentOffset, changeHandler: { (object, change) in
       print("Updated Value: \(object.contentOffset)")
 })

 // Deiniting or invalidating the observation token ends the observation
 observation.invalidate()

 // After invalidating KVO doesn't trigger anymore
Другие вопросы по тегам