ps: Saya menggunakan 'ReactiveObjC' ~> '2.1.0'
Selepas menukar parameter langgananSebelah UIColor, saya mendapat ralat "jenis penunjuk blok tidak serasi menghantar 'void(^)(UIColor __strong)' kepada parameter jenis'void(^_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) {
}];
Tetapi apabila saya menggunakan pembolehubah sementara validSearchTextSignal untuk menyimpan isyarat dan kemudian melangganSeterusnya, ia berfungsi, seperti yang ditunjukkan di bawah, kompilasi berlalu dan berjalan seperti biasa
// 方法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;
}];
Malah, kaedah pengubahsuaian adalah sangat mudah Selain kaedah di atas, anda juga boleh melakukan penukaran jenis pada pembolehubah NSString dalam Blok subscribeNext. Tetapi saya ingin tahu tentang perbezaan antara kaedah 1 dan kaedah 2. Mengapa kaedah 2 boleh dilaksanakan, tetapi kaedah 1 tidak boleh disusun.
Saya menyemak pengisytiharan kaedah ini dan jenis runcing ialah jenis id, tetapi mengapa pengkompil menggesa jenis NSString dalam senario kaedah 1. Dalam senario kaedah 2, gesaan ialah jenis id. Berikut ialah pengisytiharan kaedah Jenis paparan ialah jenis id, dan tiada pengisytiharan kaedah bagi jenis NSString ditemui
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
Maklumat tambahan:
Terdapat soalan yang sama mengenai stackoverflow RACSignal: Mengendalikan jenis penunjuk blok yang tidak serasi, satu jawapan ialah "Punca ralat adalah kerana blok subscribeNext mengembalikan terbatal dan dengan meletakkan pulangan akan menghasilkan ketidakserasian dengan tandatangan blok.” Saya masih tidak faham kenapa
Saya sedang menggunakan versi 2.5, yang agak stabil, saya cuba memasang versi 2.1, tetapi setiap kali saya memasang versi 2.1.8, jadi saya tidak dapat melihat kod sumber tertentu. ia lebih mudah