问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

iOS 7.1 的 Switch Control / Head Movement 功能怎么使用

发布网友 发布时间:2022-05-16 02:35

我来回答

1个回答

热心网友 时间:2023-10-09 08:01

IOS switch-case知多少


时间:2015-07-28 22:40:40

阅读:1731

评论:0

收藏:0

[点我收藏+]


标签:

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;

}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
U盘更新专用需要电脑打开怎么让我的U盘和电脑文件夹同步更新啊_百度知 ... 为什么我的硬盘一打开就弹出对话框说选择打开方式. 倒霉的是右键也打... 磁盘右键是打开方式怎么办 我双机盘符总是打开 打开方式 让我选择,右健第一项是打开.不知道是中了... 罗技Lightspeed怎么用? 罗技无线鼠标怎么样?怎么连接电脑使用? 为什么不建议去融资公司上班 融资担保公司一般账务处理及所涉及的会计科目有哪些 月经期间可以游泳吗 经期能不能游泳 IOS switch-case知多少 AE输出是出现The name of the selected output module is already in use.Please choose another name. 有谁在广州地铁小额贷款有限公司借过款,求指教 广东广物小额贷款有限公司是不是骗人的? qq帅气的个性签名短一点.的 谁有帅气的QQ个性签名不要太长不要太短 手机外派问题不显示意怎么办? 求帅气QQ签名 手机如果上外派然后把4g打开花钱吗? 手机怎样解帮连接的外派 手机外派显示!什么意思? 苹果电话外派怎么打密码登入 帅气点的QQ签名有哪些? 手机连接自家的外派在用手机咋样察看别人蹭网 债权的诉讼时效 赣州紫金阅江府凝是停工应该怎样维权- 问一问 买手机回家怎么添加外派? A是债务人,B是债权人,C是担保人,在借款到期前,C死亡,那C的继承人要承担担保责任吗 共益债务包括哪些,共益债务发生争议如何处理 赣州宝葫芦非法集资 ios 怎么查看一个控件是什么空间 ios开发中,如何给列表分成不同组,每组的个数不同,然后点击不同分组的不同cell进入不同的页面 nintendo switch case 侵权吗 请问一下IOS内购买二次验证的代码加在哪里? ios点击button数字加减出现小问题 中级职称咨询 产品经理培训多久 天津产品经理培训,产品经理好学吗,就业如何? 在沈阳学产品产品经理培训应该去哪个机构? 中级职称报名咨询 从网上下载的 js 图片轮播特效代码 如何将代码添加到body的制定位置 物理的自由落体的公式:v=2s/t 为什么s要2倍? 你好!请问您云开发小程序上线运行后,还可以在开发者工具的云控制台更新商品信息吗? 你好,请问云开发小程序上线运行后,还可以在开发者工具的云控制台更新商品信息吗? 你好!请问云开发控制台就是管理后台吗? 轴距2700毫米,入门就配1.5T+7DCT,哈弗初恋预售8.9万元起 广州天河区有人租房吗? 季湘蕾元宵节快乐藏头诗 在上海找滩位商铺下载什么a+p+p 这些国产家轿月销过万!真心比朗逸划算!