Переход от ReactiveCocoa 2.4.7 к ReactiveCocoa 5.0.0

Я взял на себя iOS-проект, который реализует ReactiveCocoa 2.4.7 используя CocoaPods. Приложение было запрограммировано в Swift 1.2, но позже было обновлено и теперь Swift 2.3. Однако ReactiveCocoa не был обновлен. Сейчас я нахожусь в ситуации, когда моя цель - обновить приложение до Swift 3, но для этого мне также придется обновить ReactiveCocoa.

В ReactiveCocoa 2.4.7, если я прав, я могу наблюдать значения, которые наследуются от NSObject, если они имеют dynamic ключевое слово. Из того, что я понимаю, это сделать его доступным для RAC, что сделано в Objective-C. В 5.0.0 такого нет? Должен ли я изменить все мои переменные из

dynamic var name:String? = "MyName"

в

let name:MutableProperty<String?> = MutableProperty("MyName")?

Это правильный эквивалент в 5.0.0?

1 ответ

ReactiveCocoa 2.4.7 написан на ObjC. Если можно обновить проект до Swift 3 без обновления ReactiveCocoa.

Все изменения, которые вы должны будете сделать для работы ReactiveCocoa 2.4.7 в Swift 3, будут связаны с изменением того, как Swift 3 импортирует код ObjC, по сравнению с тем, как это делал Swift 2.

Смотрите этот связанный вопрос. Преобразование в Swift 3 переименовано в мой собственный метод Objective-C

Относительно вашего вопроса об эквивалентности, ответ да и нет.

Нет: в RAC 2.x вы могли наблюдать любое свойство NSObject через RACObserve макрос, который работает через KVO (в Swift вы должны были использовать оболочку для макроса). Чтобы это работало в Swift, вам нужно использовать dynamic Ключевое слово для свойства, чтобы включить KVO.

Эквивалентом этого в RAC 5.0 является DynamicProperty<Value>, Однако, как указано в документации:

Используйте этот класс только в крайнем случае! MutableProperty как правило, лучше, если только API, который вы используете, не требует KVC/KVO

Следовательно:

Да, MutableProperty большую часть времени является правильным эквивалентом. Но это требует от вас внесения дополнительных изменений и не будет работать так же, как RACObserve сделал.

С RACObserve или же DynamicProperty, вы бы просто установить person.name = "Rudolph"и наблюдатели name собственность будет называться.

С MutableProperty, вам придется установить person.name.value = "Rudolph",

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