Мое личное решение для таких ситуаций:
#define INT_OBJ(x) [NSNumber numberWithInt:x]
@implementation MyClass
static NSDictionary *operations;
enum {
kOperationNoOp = 1,
kOperationUnaryOp,
kOperationBinaryOp,
};
+(void) initialize
{
operations = [NSDictionary dictionaryWithObjectsAndKeys:@"π", INT_OBJ(kOperationNoOp),
// unary operations
@"sin", INT_OBJ(kOperationUnaryOp),
@"cos", INT_OBJ(kOperationUnaryOp),
@"log", INT_OBJ(kOperationUnaryOp),
@"+/-", INT_OBJ(kOperationUnaryOp),
// binary operations
@"+", INT_OBJ(kOperationBinaryOp),
@"-", INT_OBJ(kOperationBinaryOp),
@"*", INT_OBJ(kOperationBinaryOp),
@"/", INT_OBJ(kOperationBinaryOp), nil];
}
-(BOOL) isNoOpOperation:(NSString *) arg
{
return [[operations objectForKey:arg] intValue] == kOperationNoOp;
}
-(BOOL) isUnaryOperation:(NSString *) arg
{
return [[operations objectForKey:arg] intValue] == kOperationUnaryOp;
}
-(BOOL) isBinaryOperation:(NSString *) arg
{
return [[operations objectForKey:arg] intValue] == kOperationBinaryOp;
}
-(BOOL) isAnOperation:(NSString *) arg
{
// if objectForKey: returns nil, intValue will return 0, telling us that the input is not an operation
return [[operations objectForKey:arg] intValue] != 0;
}
@end
Я считаю, что это очень просто и легко расширяется.