Вы можете сделать это только со стандартными классами какао, но синтаксис становится несколько нелепым, и количество настроек тоже поражает.
@interface MyExprTest : NSObject
-(void)run;
@end
@implementation MyExprTest
-(void)run {
NSExpression *e = [(NSComparisonPredicate *)[NSPredicate
predicateWithFormat:@"2*FUNCTION(2*PI*$t,'sin')==0"]
leftExpression];
NSMutableDictionary *vars = [NSMutableDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithDouble:0.04], @"t",
nil];
NSLog(@"%@", [e expressionValueWithObject:self context:vars]);
}
-(double)PI {
return M_PI;
}
@end
@interface NSNumber (Trigonometry)
- (NSNumber*)sin;
@end
@implementation NSNumber (Trigonometry)
- (NSNumber*) sin {
double result = sin([self doubleValue]);
return [NSNumber numberWithDouble:result];
}
@end
int main (int argc, const char * argv[]) {
MyExprTest *t = [[MyExprTest alloc] init];
[t run];
return 0;
}
Несколько указателей на заметку:
t
в вашем выражении стало $t
, чтобы вы могли ссылаться на него из словаря vars
M_PI
стало просто PI
;обратите внимание на добавленный метод для его поддержки - Нет встроенных тригонометрических функций;посмотрите, как
FUNCTION
и какая категория используется для ее обхода.