ReactiveCocoa соблюдает два свойства

Мне нужно проверить два значения и установить условия на основе этих двух значений, вернуть значение NS_ENUM.

Из ReactiveCocoa github readme я нашел это

RAC(self, createEnabled) = [RACSignal 
    combineLatest:@[ RACObserve(self, password), RACObserve(self, passwordConfirmation) ] 
    reduce:^(NSString *password, NSString *passwordConfirm) {
        return @([passwordConfirm isEqualToString:password]);
    }];

Он проверяет два значения, пароль и парольConfirm вместе. Я попытался немного изменить его, чтобы наблюдать за двумя свойствами BOOL, он показывает мне ошибку «Несовместимые типы указателей блоков».

RAC(self, showButtonOption) = [RACSignal
                                    combineLatest:@[ RACObserve(self, setting), RACObserve(self, billing) ]
                                    reduce:^(NSSet *setting, NSSet *billing) {
                                        if ([billing containsObject:kBillingExpired]) {
                                            return DialerShowButtonPurchase;
                                        } else if ([setting containsObject:kSettingEnableRecord]) {
                                            return DialerShowButtonRecord;
                                        } else {
                                            return DialerShowButtonCall;
                                        }
                                    }];

Я не знаю, что пошло не так и каким должен быть правильный синтаксис для этой цели?


person xialin    schedule 02.07.2014    source источник


Ответы (1)


Что ж, давайте посмотрим, какова сигнатура этого метода:

+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals
                      reduce:(id ( ^ ) ( ))reduceBlock

Вы пытаетесь вернуть значение перечисления, примитив, из reduceBlock -- которое должно иметь возвращаемый тип id.

Это раздражающий, но, к сожалению, неизбежный аспект ReactiveCocoa: вам нужно боксировать. Много. Если вы вернете @(DialerShowButtonPurchase) (и т. д.), вы фактически вернете NSNumber *, который является id, поэтому он скомпилируется.

Макрос RAC автоматически распаковывает его, так что showButtonOption не нужно объявлять как NSNumber *.

person Ian Henry    schedule 02.07.2014
comment
Спасибо! Я исправил это, вернув @(DialerShowButtonCall). - person xialin; 03.07.2014