iPhone OS:制作一个使用字符串文字作为比较器而不是整数的switch语句

nic*_*ude 2 iphone objective-c string-comparison switch-statement

所以我想这样做:

switch (keyPath) {
    case @"refreshCount":
        //do stuff
    case @"timesLaunched":
       //do other stuff
}
Run Code Online (Sandbox Code Playgroud)

但显然你只能使用整数作为开关数量.唯一的方法是将字符串解析为整数标识符然后运行switch语句吗?

像这样:

nsinteger num = nil;

if (keyPath isEqual:@"refreshCount") {

num = 0

}

if (keyPath isEqual:@"timesLaunched") {

num = 1

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试尽可能快地优化此代码,因为它会经常被调用.

谢谢,

缺口

注意:是的我正在使用KVO,所以我在"回调"中收到一个字符串.

注意#2:那么是什么让我首先考虑switch语句是我原来的代码实现是这样的:

if ([keyPath isEqual:@"refreshCount"] && ([[change valueForKey:@"new"] intValue] == 10)) { //  
NSLog(@"achievemnt hit inside");
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"Achievement Unlocked!" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil];
    [alert show];
Run Code Online (Sandbox Code Playgroud)

我想在同一个方法中用不同的XX值做一堆这些:

if ([keyPath isEqual:@"refreshCount"] && ([[change valueForKey:@"new"] intValue] == 10)) {

//unlock small achievement

}
 if ([keyPath isEqual:@"refreshCount"] && ([[change valueForKey:@"new"] intValue] == 50))   {

//unlock bigger achievement

}   

//etc
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎效率很低,但也许我错了.

bbu*_*bum 6

也就是说,对于一个演员声明来说,isEqualToString:无论如何都只需要打电话就会很慢,但可能并不像你想象的那么慢.

当然,第一个问题是您是否测量了性能并且您是否有证据表明代码导致了性能问题?

如果没有,请继续完成您的应用.一个发货应用程序总是优于仍在开发中的应用程序!

我敢打赌你没有性能问题; 如果你的所有字符串都是内联字符串常量 - @"refreshCount"等等 - 与键值观察有关,那么它们很可能都是编译到应用程序中的常量字符串,因此,比较将非常快,因为每次你提到"@refreshCount"它真的是在同一个地址的相同字符串(比较非常快).

如果您确实存在可量化的性能问题,请将详细信息发布在其他问题中,并且有人可以专门回答.事实上,除了推测之外,没有足够的建筑或定量信息来做任何事情.