首頁  >  問答  >  主體

Objective-c - RAC:傳送不相容的區塊指標類型

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: 手袋, 感覺還是沒懂為什麼

过去多啦不再A梦过去多啦不再A梦2750 天前1382

全部回覆(1)我來回復

  • 習慣沉默

    習慣沉默2017-05-02 09:36:46

    我現在使用的是2.5版本的, 比較穩定, 我嘗試安裝2.1版本, 但是每次都是安裝的2.1.8, 所以看不到具體的源碼, 你最好還是升級下吧, 方便些

    回覆
    0
  • 取消回覆