博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS switch-case知多少
阅读量:5272 次
发布时间:2019-06-14

本文共 2405 字,大约阅读时间需要 8 分钟。

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 语句块注意问题

  • case 语句是为了匹配switch中的参数的值,所以其条件值必须是常数(const).
  • case 作为一个局部语句块,也能拥有的自己的变量与内存空间,那么在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;        }

 

转载于:https://www.cnblogs.com/fortunely/p/4681640.html

你可能感兴趣的文章
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Linux中防火墙centos
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
centos下同时启动多个tomcat
查看>>
Leetcode Balanced Binary Tree
查看>>
[JS]递归对象或数组
查看>>
linux sed命令
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
程序存储问题
查看>>
优雅地书写回调——Promise
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>