typedef (void (^blockType)());
Objective-C jeta un type de bloc à un autre résultat inattendu a
Je dois jeter des blocs avec différents types d'arguments dans un même type blockType
, et l'invoquons comme le type d'origine plus tard. Mais il y a un problème lors de la conversion du type de bloc.
Le code suivant fonctionne bien avec tout type d'argument, ...
((blockType)^(BOOL b) {
NSLog(@"BOOL: %d", b);
})(YES); // >> BOOL: 1
((blockType)^(int i) {
NSLog(@"int: %d", i);
})(1); // >> int: 1
((blockType)^(double f) {
NSLog(@"double: %f", f);
})(1.0/3); // >> double: 0.333333
((blockType)^(NSString *s) {
NSLog(@"NSString *: %@", @"string");
})(1.0/3); // >> NSString *: string
sauf flotteur:
((blockType)^(float f) {
NSLog(@"float: %f", f);
})(1.0f); // >> float: 0.000000
((blockType)^(float f) {
NSLog(@"float: %f", f);
})(1.0f/3); // >> float: 36893488147419103232.000000
mais il est ok sans coulée:
(^(float f) {
NSLog(@"float without casting: %f", f);
})(1.0/3); // >> float without casting: 0.333333
comment l'expliquer et le résoudre? Explication: Appelant le bloc (void (^)())
, le bloc est traité comme (void (^)(double))
.
Comment le résoudre? Ne faites pas cela :) – jtbandes
@jtbandes Vous avez raison :( – iwill