[文章] Swift快速入门之流程控制(5) 流程控制结构化的程序设计,不管是面向过程,还是面向对象,都离不开三种基本结构。即:顺序结构、选择结构、循环结构。顺序执行自然不用多说。选择结构即基于特定的条件执行不同的代码分支,如if,guard和switch等条件语句。循环结构主要是For-in,While和Repeat-While语句。Ifconditionals你可以使用if语句来判定简单的条件,比如少量的可能性。switch语句则适合更复杂的条件,比如多个可能的组合,并可以进行模式匹配。简单用法//IF//最简单的用法,条件表达式不需要小括号,大括号不能省略letage=20ifage>18{print("成年了")}letscore=61ifscore>60{print("及格")}else{print("不及格")}If-let可选绑定注意:当碰到可选类型(Optionals)时,if语句就会变得有些不可控了!letscore:Int?=61//or:letscore:Int?=nilifscore>60{print("scoreis:\(score+0)")}else{print("不及格")}根据Xcode的提示,我们有两种方式进行修复://修改方式1://使用??操作符,但是??必须提供一个默认值!恶心letscore:Int?=61ifscore??0>60{print("scoreis:\(score??0+0)")}else{print("不及格")}//输出61//修改方式2://使用!断言,我确信没有问题的,可选类型可以unwrapped为Int类型!//虽然我确信,但是程序崩了我不负责!🤮letscore:Int?=61ifscore!>60{print("scoreis:\(score!+0)")}else{print("不及格")}//修改方式3letscore:Int?=61ifscore!=nil{//即使我们已经判空了,这里还是可选的类型,不能直接运算ifscore!>60{print("及格了")}else{print("不格了")}}else{print("什么都没有")}以上方式都很恶心啊,试试iflet吧if-let可以检查一个Optional类型所持有的值,使用if-let判断后不需要解包letscore:Int?=61ifletnewScore=score{ifnewScore>60{print("及格了:\(newScore)分")}else{print("不及格")}}//输出:及格了:61分newScore的作用域仅在{}中,当然Swift推荐我们可以重用score的命名,即:letscore:Int?=61ifletscore=score{ifscore>60{print("及格了:\(score)分")}else{print("不及格")}}如果你觉得上述写法还不够爽,看看下面的写法:letscore:Int?=61ifletscore=score,score>60{print("及格了\(score)")}else{print("不及格")}参考文档:https://github.com/apple/swift-evolution/blob/master/proposals/0099-conditionclauses.mdSwift3之前的写法是:ifletscore=scorewherescore>60guardletguardlet和iflet刚好相反,guardlet守护一定有值。如果没有,直接返回。funccheckUsername(username:String){guardusername=="admin"else{print("你不是管理员,没有权限")return}print("欢迎你,管理员:\(username)")}checkUsername(username:"JackMa")//不是管理员,没有权限checkUsername(username:"admin")//欢迎你,管理员:admin如果是可选类型能,使用guardlet即可:funccheckUsername(username:String?){guardletusername=username,username=="admin"else{print("你不是管理员,没有权限")return}print("欢迎你,管理员:\(username)")//可以随心所欲的使用username了}checkUsername(username:"JackMa")//不是管理员,没有权限checkUsername(username:"admin")//欢迎你,管理员:admincheckUsername(username:nil)//你不是管理员,没有权限guardlet的用法必须掌握,真实项目中,用的非常多的。switchstatements基础用法letname="admin"switchname{case"Jack":print("Jack")case"admin":print("Admin")default:print("NotJack,notAdmin")}注意:switch语句中不需要*break,并且switch会终止执行如果如果你想在switch中让case之后的语句会按顺序继续运行,则需要使用fallthrough语句。letvalue="1"switch(value){case"1":print("go")fallthroughcase"2":print("go")fallthroughdefault:print("go")}//输出3个gogogo//是不是感觉fallthrough完全没有什么卵用高级用法文章开头我们提到,Swift适合复杂的条件判断,看看下面的示例://区间匹配letscore=60switchscore{case0:print("Zero,傻瓜")case1..<60:print("不及格")case60..<70:print("及格")case70..<90:print("良好")case90...100:print("优秀")default:print("翻天了")}//当score为0,输出Zero,傻瓜//当score为1-59,输出不及格//当score为60-69,输出及格//当score为101输出及格翻天了//匹配元祖//可以使用元组来在一个switch语句中测试多个值letsomePoint=(1,1)switchsomePoint{case(0,0):print("(0,0)isattheorigin")case(_,0):print("(\(somePoint.0),0)isonthex-axis")case(0,_):print("(0,\(somePoint.1))isonthey-axis")case(-2...2,-2...2):print("(\(somePoint.0),\(somePoint.1))isinsidethebox")default:print("(\(somePoint.0),\(somePoint.1))isoutsideofthebox")}//prints"(1,1)isinsidethebox"//匹配enumenumDireactionModel{caseEast,South,West,North}letdirection=DireactionModel.Eastswitchdirection{case.East:print("东方")case.South:print("南方")case.West:print("西方")case.North:print("北方")}//输出:东方//关于Swift的用法还有很多,比例和where一起使用,可以和class结合使用,等等循环LoopsFor-in循环使用for-in循环来遍历序列,比如一个范围的数字,数组中的元素或者字符串中的字符。//数字区间foriin0...2{print(i)}//Bothprint://0//1//2//遍历数组letnames=["Anna","Alex","Brian","Jack"]fornameinnames{print("Hello,\(name)!")}//Hello,Anna!//Hello,Alex!//Hello,Brian!//Hello,Jack!//遍历字典letnumberOfLegs=["spider":8,"ant":6,"cat":4]for(animalName,legCount)innumberOfLegs{print("\(animalName)shave\(legCount)legs")}//antshave6legs//catshave4legs//spidershave8legs//enumerated()Returnsasequenceofpairs(n,x)//enumerated()返回一个新的序列,包含了初始序列里的所有元素,以及与元素相对应的编号for(n,c)in"Swift".enumerated(){print("\(n):'\(c)'")}//Prints"0:'S'"//Prints"1:'w'"//Prints"2:'i'"//Prints"3:'f'"//Prints"4:'t'"whilevarnum=1whilenum<3{print("num:\(num)")num+=1}//num:1//num:2Repeat-whileloopvari:Int=0repeat{print(i)i+=1}whilei<3Repeat-while会比do-while更富语义吗?where子句letstudents=["Jack":13,"Lucy":59,"Jim":88,"Tom":90]for(name,score)instudentswherescore<60{print("\(name)不及格")}//Lucy不及格//Jack不及格forEach//定义/*Callsthegivenclosureoneachelementinthesequenceinthesameorderasafor-inloop.*/funcforEach(_body:(Int)throws->Void)rethrows//可见,forEach参数是一个闭包。将序列的元素作为参数letarr=[1,2,3,4]arr.forEach{print($0)}//等同于arr.forEach{numinprint(num)}好了,关于Swift中的流程控制就介绍到这里了,是不是既简单又不简单。