Переход от 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"
,