加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在目标c中使用字符串实现可读开关案例的最佳方式?

发布时间:2020-12-15 01:39:13 所属栏目:百科 来源:网络整理
导读:在其他动态语言(如ruby,javascript等等)中,您可以简单的做一下: switch(someString) { case "foo": //do something; break; case "bar": // do something else; break; default: // do something by default;} 在目标c中,因为它来自于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.但是,如何最小化这个简单任务的对象分配?有人为此做了“更好的做法”吗?

编辑:
下面的代码是我想要做的,但是获取枚举或#define的值有点不舒服.因为我创建了一个应用程序,只需要一个输入,我可以在其中编写字符串来获取该哈希值并返回到xcode并设置枚举值.所以我的问题是,我不能这样做,在运行时间,因为开关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

注意:散列函数可以在通用命名空间中的其他位置定义,以便在任何地方使用它,通常我为这种东西创建一个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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读