![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
2.4 选择结构
对于任何程序语言来说,有能力进行判断是一项基本的特性,例如在循环语句中就需要判断何时来终止循环。Objective-C兼容了C语言的特性,所以C语言中的几种选择结构仍然适用于Objective-C语言:包括if语句、switch语句、conditional运算符。
2.4.1 if语句
if语句是Objective-C语言提供的具有判断能力的语言结构,通过判定所给条件的真假来选择需要执行的操作。if语句有以下几种常见的使用形式。
1.简单if语句
if语句可以设置一个条件表达式,当条件表达式的返回结果为真时,执行特定的操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T49_6059.jpg?sign=1739328451-geM0To9UJixkhioN1QXeKnzCInwH2UcR-0-c0077e3e04e43502933dc92df0022cc0)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T50_6206.jpg?sign=1739328451-p1wn2SmHq8Z9NqmMYz7ByGgwYMziJjQt-0-2b26235f17c3fc4f541ff555f91e9b5b)
运行结果如图2-17所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P50_6208.jpg?sign=1739328451-K3TDzi9dCBS7Dj4LSFicUyso7GPFL7zL-0-6b51dbe366ed23c98314db0e598786ac)
图2-17 运行结果
2.if-else语句
if-else语句可以实现当条件表达式的返回值为真以及为假时,定义各自需要执行的操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T50_6212.jpg?sign=1739328451-OvTJ0SKs4VTYQfoQWL6nawUNrjEaiZKr-0-56daeac2b6201457e5be2eac0cb6943d)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T50_6214.jpg?sign=1739328451-JO1YBJgEG4mtjA0eBQLVpnke1IYvYfil-0-64d3b9347bb667c1d90d8fd072bb4066)
运行结果如图2-18所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P51_6360.jpg?sign=1739328451-xq8h4zelIGZLVq8PyDRnp8ylAXjsSN6c-0-216bb2cb5410e909ce9ae926275a3b9d)
图2-18 运行结果
3.if-else if-else语句
在该形式下,可以设置多个判断条件,以及满足各个条件时需要执行的操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T51_6364.jpg?sign=1739328451-hz1eQBEXVMA9rbEGY3aqFweQ4LK4uPRU-0-8fb938bb5408f2a73336e5a51c639773)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T51_6366.jpg?sign=1739328451-EsDs5ZDbmOmqaO2B4EkhNZ8jOyRS7H6x-0-c6af6afce1d328ea6ef346577ee55c59)
运行结果如图2-19所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P51_6368.jpg?sign=1739328451-Hq56bdObY8sQH6W7Cg57NtqFYh6N3xNn-0-5a8da48469700f8694e5a1ae321bf8d5)
图2-19 运行结果
另外,if语句也是可以多层嵌套的,在多层嵌套的if语句中,每个判断条件下的语句都应该使用大括号括起来,避免发生歧义。
2.4.2 switch语句
1.switch语句
除了if语句之外,Objective-C语言还提供了用于多分支选择的switch语句,其一般形式为:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T52_6547.jpg?sign=1739328451-9i16QzeH2z0sKVpBBtvvoqUVDtmeGlW8-0-b57a38e21d4a741707d761aaedba15a2)
其语义是:计算表达式的值,并逐个与其后常量表达式的值进行比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。所以为了让程序只执行某个case后面的语句时,需要在该case的末尾添加break语句。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T52_82805.jpg?sign=1739328451-LIabuDimoXVU0KKcEWmVucAMiHiclOxg-0-2b4d1a294d956dd9e623c4f03a3040eb)
运行结果如图2-20所示。当输入数字1时,打印结果是Monday。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P53_6722.jpg?sign=1739328451-z93MdOixZmHk1AzPren67RpbGF6hdZ0T-0-9111c49b779d2801facefb52aca7cab1)
图2-20 运行结果
2.switch中的break语句
假如在每个case语句中,不主动添加break语句,那么程序在判断后,会执行后面所有case后的语句。可以把上面的代码进行一些修改,去掉case语句中的break代码后再执行一次。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T53_6726.jpg?sign=1739328451-wDCnTFS03vbWs5yGqAmkoJEoxUqyra8g-0-34eabccdb17f5026a8169926b3cf5114)
运行结果如图2-21所示,当输入1时,会打印出所有case以及default中执行的代码。因此,在使用switch语句时,每个case语句执行最后,不要忘记添加break。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P54_6862.jpg?sign=1739328451-V6SGVggqxeduytt8vpgBihmOCu46eFjU-0-8c9a1a0f78e1ebbaa0a9a354e2bfad1d)
图2-21 运行结果
3.switch语句的简写方式
在使用switch语句时,有时候会出现很多个case下需要执行的代码都相同的情况,那么可以使用下面的简化形式:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T54_6866.jpg?sign=1739328451-eIuXpb9s4B6A6Hc03E1rZnwQMkUUAbKl-0-6668e1cb834f3ebf354fb1befbeaa31f)
上面的代码中case 1~case 5执行的代码相同,都会打印weekday;case 6和case 7执行的代码相同,都会打印weekend。运行结果如图2-22、图2-23所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P54_6868.jpg?sign=1739328451-2jYsJEdando5mGaLzlpykgi8Z4gyQMRq-0-0a5b94654c59ea07f04f72468d19b5c1)
图2-22 运行结果
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P55_6987.jpg?sign=1739328451-TX1FYQk8uRA00vwnn7sDiNPJ4Q173gAb-0-cd93548b5a43347771b9be2721160f5e)
图2-23 运行结果
4.switch语句中定义新变量
如果在switch语句的case中出现定义新变量时,那么case语句冒号后的内容需要加上大括号,否则编译器会报错,其他情况下多行语句可以不用大括号括起,程序会按顺序执行每一行代码。
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T55_6991.jpg?sign=1739328451-GgHFTBPY0sgaYwM0Yq8WtSYScP2F4lgY-0-f03f4a5db0e52ddaa64e2375ed2aebef)
2.4.3 条件运算符/三目运算符
1.条件(conditional)运算符简介
条件运算符是Objective-C语言中较为特殊的一种运算符,因为它是三元运算符,也就是说它需要接收三个运算数。条件运算符的一般格式为:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T55_6994.jpg?sign=1739328451-pydswVAoNKCs2eAySWR7xiZ6cGX1yA1M-0-6ddfce1e4999a123ccf5e9028df9ebf5)
在这个语法当中,condition表示一个表达式,通常为关系表达式,编译器会首先对其求值。如果对condition的求值结果为真(非零)时,程序将返回expression1的结果,如果对condition的求值结果为假(值为零)时,程序将返回expression2的结果。
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T55_6996.jpg?sign=1739328451-FkzTrAdAeWAsWxnmnR2LJ50LgCnkTypc-0-3f5f8f18d26cb1e64bd4ddfb0abffc04)
上面代码的意思是比较a与b的大小,将a与b中较大的一个赋给max。
2.条件运算符使用注意事项
条件运算符在使用中需要注意如下事项。
- 条件运算符优先级高于赋值、逗号运算符,低于其他运算符,例如:“m<n ? x : a+3”等价于“(m<n)?(x) : (a+3)”。
- 条件运算符具有右结合性。当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。例如:“e1 ? e2 : e3 ? e4: e5”与“e1 ? e2 : ( e3 ? e4 : e5)”等价。
使用条件表达式可以提高程序的运行效率,但是会降低程序的可读性,尤其是多重条件表达式嵌套使用时,会使程序阅读起来很吃力。