ps : j'utilise 'ReactiveObjC' ~> '2.1.0'
Après avoir modifié le paramètre de SubscribeNext sur UIColor, j'obtiens l'erreur "types de pointeurs de bloc incompatibles envoyant 'void(^)(UIColor __strong)' au paramètre de type'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) {
}];
Mais quand j'utilise la variable temporaire validSearchTextSignal pour stocker le signal puis souscrireNext, cela fonctionne, comme indiqué ci-dessous, la compilation réussit et s'exécute normalement
// 方法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;
}];
En fait, la méthode de modification est très simple. En plus de la méthode ci-dessus, vous pouvez également effectuer une conversion de type sur la variable NSString dans le bloc de SubscribeNext. Mais je suis curieux de connaître la différence entre la méthode 1 et la méthode 2. Pourquoi la méthode 2 peut-elle être implémentée, mais la méthode 1 ne peut pas être compilée.
J'ai vérifié la déclaration de cette méthode et le type pointé est le type id, mais pourquoi le compilateur demande-t-il le type NSString dans le scénario de la méthode 1. Dans le scénario de la méthode 2, l’invite est le type d’identifiant. Ce qui suit est la déclaration de la méthode. Le type d'affichage est le type id, et aucune déclaration de méthode du type NSString n'est trouvée
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
Informations supplémentaires :
Il existe une question similaire sur stackoverflow RACSignal : Gestion des types de pointeurs de bloc incompatibles, une réponse est "La raison de l'erreur est que le bloc SubscribeNext renvoie void et en plaçant un return générera l'incompatibilité avec le bloquer la signature. » Je ne comprends toujours pas pourquoi
J'utilise actuellement la version 2.5, qui est relativement stable. J'ai essayé d'installer la version 2.1, mais à chaque fois que j'installe la version 2.1.8, je ne vois donc pas le code source spécifique. c'est plus pratique