Dam*_*Dam 15 xcode objective-c switch-statement
在其他动态语言中,如ruby,javascript等,你可以这样做:
switch(someString) {
case "foo":
//do something;
break;
case "bar":
// do something else;
break;
default:
// do something by default;
}
Run Code Online (Sandbox Code Playgroud)
在objective-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
Run Code Online (Sandbox Code Playgroud)
这似乎没问题,但#define使foo和bar像保留字一样,我不能在我的代码中使用.如果我用类常量替换定义常量,这个问题是固定的,因为在其他类中我必须在常量名之前使用MyClassName.但是,如何最小化这个简单任务的对象分配?有人为此做了"更好的练习"吗?
编辑: 下面的代码是我想要做的,但是获取枚举或#define的值有点不合适.因为我创建了一个只有输入的应用程序,我可以编写字符串来获取该哈希值并返回xcode并设置枚举值.所以我的问题是我不能在运行时间那样做,因为switch case语句的主要行为......或者如果我用那种NSDictionary方式做到这一点 - >与这个解决方案相比,它有很多开销.
#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
Run Code Online (Sandbox Code Playgroud)
注意:哈希函数可以在公共命名空间的其他地方定义,以便在任何地方使用它,通常我会为这种东西创建一个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;
Run Code Online (Sandbox Code Playgroud)
更新:我发现了一个"可能的解决方案"但它似乎只适用于g ++ 4.6>.广义常量表达式可以为我做.但我还在测试......
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33895 次 |
| 最近记录: |