ps:使用的是'ReactiveObjC' ~> '2.1.0'
將subscribeNext的參數修改為UIColor後報錯"incompatible block pointer types sending 'void(^)(UIColor __strong)' to parameter of type' ^_Nonnull)(NSString _Nullable __strong)'"
// 默认
[[self.searchText.rac_textSignal map:^id(NSString *text) {
return [self isValidSearchText:text] ? [UIColor clearColor] : [UIColor yellowColor];
}]
subscribeNext:^(NSString * _Nullable x) {
}];
// 方法1 将subscribeNext中的类型修改为UIColor类型
[[self.searchText.rac_textSignal map:^id(NSString *text) {
return [self isValidSearchText:text] ? [UIColor clearColor] : [UIColor yellowColor];
}] subscribeNext:^(UIColor *color) {
}];
但當我使用臨時變數validSearchTextSignal儲存訊號再進行subscribeNext則可以,如下所示,編譯通過並正常運行
// 方法2
RACSignal *validSearchTextSignal = [self.searchText.rac_textSignal map:^id(NSString *text) {
return [self isValidSearchText:text] ? [UIColor clearColor] : [UIColor yellowColor];
}];
[validSearchTextSignal subscribeNext:^(UIColor *color) {
self.searchText.backgroundColor = color;
}];
其實修改方式很簡單,除了上述方法,還可以對suscribeNext的Block中的NSString變數進行型別轉換即可。但我比較好奇方法1與方法2的差別在哪裡。為什麼方法2可以實現,但用方法1就編譯不過去。
我查看了該方法的聲明,指向的類型為id類型,但為什麼編譯器在方法1情境下提示的是NSString 類型。方法2情境提示的是id型別。如下為此方法的聲明,顯示類型為id類型,並沒有發現NSString類型的方法聲明
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
補充資料:
stackoverflow上也有類似的問題RACSignal: 手袋, 感覺還是沒懂為什麼
我現在使用的是2.5版本的, 比較穩定, 我嘗試安裝2.1版本, 但是每次都是安裝的2.1.8, 所以看不到具體的源碼, 你最好還是升級下吧, 方便些