J'essaie de suivre un article de blog Dave DeLong here. Nous construisons une catégorie sur NSNumber pour calculer la factorielle. Il semble fonctionner très bien, mais quand je l'envelopper dans un NSExpression et essayer d'évaluer l'expression, je reçoisFonctions personnalisées avec NSExpression: sélecteur non reconnu
[NSCFNumber factorial:]: unrecognized selector sent to instance 0x100108d40'
Mais l'objet à cette adresse est le NSNumber, qui reconnaît que sélecteur. Je suis perplexe.
#import <Foundation/Foundation.h>
@interface NSNumber (FactorialExpression)
- (NSNumber *) factorial;
@end
@implementation NSNumber (FactorialExpression)
- (NSNumber *) factorial {
double baseValue = [self doubleValue];
double result = tgamma(baseValue+1);
return [NSNumber numberWithDouble:result];
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSNumber *n = [NSNumber numberWithDouble:4.2];
NSLog(@"%@ %@", n, [n factorial]);
NSLog(@"%p %d", n, [n respondsToSelector:@selector(factorial)]);
NSExpression *f = [NSExpression expressionForConstantValue:n];
NSExpression *e = [NSExpression expressionForFunction:f
selectorName:@"factorial:"
arguments:nil];
NSLog(@"operand %@ %@", [e operand], [[e operand] class]);
NSLog(@"operand %@", [e function]);
id result = [e expressionValueWithObject:nil context:nil];
//NSLog(@"%@ %@", [result description], [result class]);
[pool drain];
return 0;
}
2011-03-13 10:09:02.312 test[94896:903] 4.2 32.57809605033135
2011-03-13 10:09:02.314 test[94896:903] 0x100108d40 1
2011-03-13 10:09:02.315 test[94896:903] operand 4.2 NSConstantValueExpression
2011-03-13 10:09:02.316 test[94896:903] operand factorial:
2011-03-13 10:09:02.316 test[94896:903] -[NSCFNumber factorial:]: unrecognized selector sent to instance 0x100108d40
Qu'est-ce que je ne comprends pas à ce sujet? Merci.
C'est embarrassant. Une faute de frappe stupide. Désolé les gars.