Наблюдайте за свойством класса ObjC в Swift

Я использую стороннюю библиотеку, для которой у меня есть заголовочный файл ObjC. В этом заголовочном файле есть свойство, которое я хотел бы наблюдать в своем коде Swift. Теперь мой вопрос: могу ли я каким-то образом расширить класс ObjC без файла .m, чтобы я мог наблюдать за свойством всякий раз, когда оно изменяется в Swift? Я думал об использовании KVO, но тогда мне нужно было бы изменить реализацию класса ObjC?

Спасибо за вашу помощь


person stu7000    schedule 03.11.2016    source источник


Ответы (1)


Предположим, что ваш класс Objective-C имеет вид соблюдение пар ключ-значение, вы можете использовать addObserver(_:forKeyPath:options:context:). Вот пример:

// Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property NSString * name;
@property int age;

- (id) initWithName:(NSString *) name
                age:(int) age;

@end

// Person.m
#import "Person.h"

@implementation Person

- (id) initWithName:(NSString *) name
                age:(int) age
{
    if (self = [super init]) {
        self.name = name;
        self.age = age;
    }

    return self;
}

@end

И снова в Swift:

extension Person {
    override public func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if let keyPath = keyPath,
            let change = change,
            let oldValue = change[NSKeyValueChangeOldKey],
            let newValue = change[NSKeyValueChangeNewKey] {

            print("'\(keyPath)' has changed from \(oldValue) to \(newValue)")
        }
    }
}

let p = Person(name: "John", age: 42)

// Start observing changes
// In this case, the object will observe itself
p.addObserver(p, forKeyPath: "name", options: [.New, .Old], context: nil)
p.addObserver(p, forKeyPath: "age", options: [.New, .Old], context: nil)

p.name = "Jack"
p.age = 50

// You must remove all observers before releasing the object
p.removeObserver(p, forKeyPath: "name")
p.removeObserver(p, forKeyPath: "age")
person Code Different    schedule 03.11.2016