在目标c中使用字符串实现可读开关案例的最佳方式?
在其他动态语言(如ruby,javascript等等)中,您可以简单的做一下:
switch(someString) { case "foo": //do something; break; case "bar": // do something else; break; default: // do something by default; } 在目标c中,因为它来自于c语言,所以你不能这样做.我最好的做法是: #import "CaseDemo.h" #define foo 1 #define bar 2 static NSMutableDictionary * cases; @implementation CaseDemo - (id)init { self = [super init]; if (self != nil) { if (cases == nil) { // this dict can be defined as a class variable cases = [[NSMutableDictionary alloc] initWithCapacity:2]; [cases setObject:[NSNumber numberWithInt:foo] forKey:@"foo"]; [cases setObject:[NSNumber numberWithInt:bar] forKey:@"bar"]; } } return self; } - (void) switchFooBar:(NSString *) param { switch([[cases objectForKey:param] intValue]) { case foo: NSLog(@"its foo"); break; case bar: NSLog(@"its bar"); break; default: NSLog(@"its default"); break; } } @end 这似乎是可以的,但#define使foo和bar像保留字,我不能在我的代码中使用.如果我用类常量替换定义常量,这个问题是固定的,因为在其他类中,我必须在常量名之前使用MyClassName.但是,如何最小化这个简单任务的对象分配?有人为此做了“更好的做法”吗? 编辑: #import "CaseDemo.h" typedef enum { foo = 1033772579,bar = -907719821 } FooBar; unsigned int APHash(NSString* s) { const char* str = [s UTF8String]; unsigned int len = [s length]; unsigned int hash = 0xAAAAAAAA; unsigned int i = 0; for(i = 0; i < len; str++,i++) { hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ (*str) * (hash >> 3)) : (~((hash << 11) + ((*str) ^ (hash >> 5)))); } return hash; } @implementation CaseDemo - (void) switchFooBar:(NSString *) param { switch(APHash(param)) { case foo: NSLog(@"its foo"); break; case bar: NSLog(@"its bar"); break; default: NSLog(@"its default"); break; } } @end 注意:散列函数可以在通用命名空间中的其他位置定义,以便在任何地方使用它,通常我为这种东西创建一个Utils.h或Common.h. 注2:在“真实字”中,我们需要使用一些加密散列函数,但是现在我使用Arash Partow的算法来保持这个例子的简单. 所以,我的最后一个问题是:有没有办法用预处理器评估这些值?我认为不,但也许:-) 就像是: // !!!!!! I know this code is not working,I don't want comments about "this is wrong" !!!! // I want a solution to invoke method with preprocessor,or something like that. typedef enum { foo = APHash(@"foo"),bar = APHash(@"bar") } FooBar; 更新:我发现了一个“也许解决方案”,但它似乎与g 4.6>只要. generalized constant expressions可能是为我做的但我还在测试.??.. 解决方法typedef enum { foo,bar } FooBar; - (void) switchFooBar:(NSString *) param { switch([[cases objectForKey:param] intValue]) { case foo: NSLog(@"its foo"); break; case bar: NSLog(@"its bar"); break; default: NSLog(@"its default"); break; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |