Написание 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