标签:
1. switch参数类型
switch参数类型要求是integer type,准确来讲,是可以转换成integer的类型, 这包括所有的C基本数据类型((signed/unsigned)char, (short/long signed/unsigned)int, float, double, longlong, bool(C++/objective-c) ),还有枚举类型,但是不包括字符串、结构体、联合体、对象、函数指针等复杂类型。
其实字符串地址指针、对象址指指针等指针,都是可以转化为UInteger, 因为它们在内存中地址都可以理解成unsigned int, 但是为什么不能使用这些指针作为switch的参数呢? 这是因为这些指针都是动态指定的,每次运行编译器/程序指定的地址不尽相同,这就会导致case语句会无法判断是哪一种条件成立,而case后面的条件要求必须是常量;复杂对象的引用往往是利用指针指向的,既然指针都是无法确定其值的,所以复杂对象自然无法作为switch参数了.
e.g. 1 下面这段代码使用NSString指针作为switch参数,编译无法通过, 提示Statement requires expression of integer type(‘NSString *__strong‘ invalid)错误
NSString *str = [NSString stringWithFormat:@"I am a string."]; NSLog(@"(NSInteger)str=%lx", (NSInteger)str); switch (str) { case (NSInteger)nil: NSLog(@"case nil"); break; default: NSLog(@"case default"); break; }
e.g. 2将switch参数(NSString * )str 修改为(UInteger)str后编译通过,运行也无错误,但是却没有执行任何case语句
NSString *str = [NSString stringWithFormat:@"I am a string."]; NSLog(@"(NSInteger)str=%lx", (NSInteger)str); switch ((NSInteger)str) { case (NSInteger)nil: NSLog(@"case nil"); break; default: NSLog(@"case default"); break; }
再次运行发现,两次运行(NSInteger)str 输出的地址结果都不一样
第1次 Log输出
(NSInteger)str=1001002e0
第2次 Log输出
(NSInteger)str=1002021c0
这样自然就匹配不到正确确定的case 语句了。如果想要匹配怎么办?那就只能改用if-else语句了,能达到更灵活的效果。
NSString *str = [NSString stringWithFormat:@"I am a string."]; NSString *str2 = str; if (str2 == str) { NSLog(@"\nstr2 == str"); }else{ NSLog(@"\nstr2 != str"); }
Log输出
str2 == str
2.case 语句块注意问题
switch (1) { case 1:{ int a=1; NSLog(@"1. a=%d", a); } NSLog(@"2. a=%d", a); //编译错误 使用未声明标示符‘a‘ int a=2; //正常通过编译 NSLog(@"3. a=%d", a); break; case 2: int a=3; //编译错误 非预期表达式 break; }
标签:
原文地址:http://www.cnblogs.com/fortunely/p/4681640.html