Swift, можно ли было заставить ReactiveCocoa работать по протоколу

Я думаю, что это хорошо, если код был интерфейсом привода
так как заставить ReactiveCocoa работать по протоколу в swift? например

protocol SomeBody {
    var name: String { get set }
}
...
class XXViewController {
    @IBOutlet weak var someLabel:UILabel!
    var someOne: SomeBody {
        didSet {
            RACObserve(someOne, "name").subscribeNext { [weak self](name) -> Void in
                self?.someLabel.text = name as! String
            }
        }
    }
   ....
}

1 ответ

Решение

RACObserve построен на вершине КВО, так что для его работы name должен быть наблюдаемым значением ключа. Объекты в Swift по умолчанию не совместимы с KVO.

Вы можете добавить соответствие KVO, унаследовав от NSObject:

class Foo : NSObject, SomeBody {
    var name: String = ""
}

Или сделать индивидуальную собственность наблюдаемой:

class Foo : SomeBody {
    dynamic var name: String = ""
}

AFAIK, нет способа обеспечить такое поведение с помощью определения протокола, только поддерживать его в отдельных реализациях.

Другие вопросы по тегам