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;
}

IOS switch-case知多少的更多相关文章

  1. 李洪强漫谈iOS开发[C语言-040]-switch case

    李洪强漫谈iOS开发[C语言-039]-switch case 补充:

  2. Android Studio快捷键switch case 轻松转换为if else

    Android Studio快捷键switch case 轻松转换为if else 今天碰到的问题,没有找到资料,后面找到了方法,这个记下来,转载请注明出处:http://www.cnblogs.co ...

  3. java中的switch case

    switch-case语句格式如下 switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //... ...

  4. 为什么说在使用多条件判断时switch case语句比if语句效率高?

    在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...

  5. c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)

    1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数 ...

  6. 运算符 与 分支语句:if ,else if,else;switch case

    分支语句: if        else if       else      :    switch          case --如何使用 if  else if  else: Console. ...

  7. switch...case和if...else if的判断应用

    判断成绩所属等级的 两种方法 1...      switch...case方法: #include<stdio.h> int main(void) { ;i <= ;++i) // ...

  8. go语言选择语句 switch case

    根据传入条件的不同,选择语句会执行不同的语句.下面的例子根据传入的整型变量i的不同而打印不同的内容: switch i { case 0: fmt.Printf("0") case ...

  9. 简谈switch case

    工作中从buff里截取了一个字符串,然后和配置文件中的字符串名字对比 ,如果一样,处理,不一样,elseif 再判断,再处理! switch(){case : case :...... }先说语法,再 ...

  10. 用Dictionary替换switch case

    用switch case处理一个很长的判断,例如56个民族01代表汉族,02代表藏族,03代表壮族...,当传入数字想获取民族名称时就得写56个case,当传入民族获取背后的数字时,又得再写56个ca ...

随机推荐

  1. dfs & bfs总结

    dfs 最简单的三种形式递归总结 bfs 百度https://baike.baidu.com/item/%E5%AE%BD%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7 ...

  2. Laravel Vuejs 实战:开发知乎 (1)项目环境配置和用户表设计

    1.使用laragon新建laravel项目 zhihu 2.配置env文件的database设置 DB_DATABASE=zhihu 3.分析users表需要的字段 4.修改数据库迁移文件: cla ...

  3. windows与linux的文件路径

    在windows操作系统中,文件路径的分隔符是反斜杠(“\\”),例如: E:\\hsta\\pdf(这里为防止转义,所以要写成两个反斜杠) 但是在linux操作系统中,文件的分隔符是斜杠(“/”), ...

  4. centos 默认php 版本太低移到高版本的办法

    // centos 默认有php 版本太低转移到高版本的解决办法 php -v 版本低 ln -s /usr/local/php/bin/php /usr/bin/php

  5. UIKeyWindow的设置

    新建一个纯代码iOS项目,需要对AppDelegate文件和项目的Info.plist文件做一番配置. 第一步:将Info.plist中的下面两项的value删除掉(保留空字符串),如下图 第二步:在 ...

  6. ubuntu13.10更新sources.list

    步骤: 1>设置网络连接方式,NAT 2>自动获取ip address 10.0.2.15 3>更新源soureces.list soureces.list deb http://m ...

  7. nginx 的请求处理阶段

    nginx处理的11个阶段 nginx处理用户请求的流程 接收用户请求头部之后 1 .匹配对应得location 2.是否进行限速 3.验证用户是否有权限访问该资源:和判断是否是盗链的请求 4.生成用 ...

  8. git add 添加错文件 撤销

    git status 先看一下add 中的文件 git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 git reset HEAD XXX/XXX/XXX.java ...

  9. SpringBoot 获得 properties 文件中数据方式

    参考:https://blog.csdn.net/qq_37171353/article/details/78005845

  10. HDU 5568:sequence2 大数+DP

    sequence2  Accepts: 93  Submissions: 358  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6553 ...