07.Swift條件和循環(huán)語(yǔ)句

/*控制轉(zhuǎn)移語(yǔ)句:
 continue: 本次循環(huán)完成了钳降,開(kāi)始下一次循環(huán)
 break:結(jié)束循環(huán)蹲盘,跳到循環(huán)體結(jié)束的大括號(hào)后的第一行代碼
 fallthrough:貫穿感昼,會(huì)穿透當(dāng)前,執(zhí)行下一步
 return
 throw
 
 */
//=================================if恰画、guard-else围详、for-in 語(yǔ)句=================================
let dataArr = [15,51,67,89,32]
var num = 0
for score in dataArr {//遍歷數(shù)組外驱,大于50屠凶,num加3,否則加1
    if score > 50 {
        num += 3
    }else{
        num += 1
    }
}
print("num的值為:\(num)")

//可選值:在類型后加一個(gè)?
//可以使用if 和 let來(lái)處理值缺失的情況,這個(gè)值可以用可選值來(lái)代替(可選值是一個(gè)具體的值或者nil螃壤,如果是nil表示的是值缺失抗果,在類型后面加一個(gè)?來(lái)表示這個(gè)變量的值是可選的)
var optionStr:String? = "Hello"
print(optionStr == nil)//輸出的是判斷結(jié)果

var optionName:String? = nil//"張三"
var greeting = "World!"
if let name = optionName{//optionName 不為nil,會(huì)把值賦值給name奸晴,這樣在代碼塊中就可以用了
    greeting = "Hello,\(name)"
}else{
    greeting = "HelloKitty"http://進(jìn)入到此name相當(dāng)于沒(méi)有定義
}

//默認(rèn)值 用 ?? 表示
let nickName:String? = "小四兒"http:// nil
let fullName:String? = "李四"
let informalGreeting = "Hi \(String(describing: nickName ?? fullName))"http://如果nickName為nil就用fullName

//遍歷數(shù)組和字典
let arrDic = ["x": [2, 3, 5, 7, 11, 13],
              "y": [1, 1, 2, 3, 5, 8],
              "z": [1, 4, 9, 16, 25],
             ]
var max = 0
for (_,value) in arrDic {//遍歷字典,前一個(gè)key用不到可以用_代替
    for num in value { //遍歷字典的每個(gè)value數(shù)組
        if num > max {//如果value數(shù)組中的值大于max
            max = num//就把這個(gè)值賦值給max
        }
    }
}
print("字典中的最大值為:\(max)")

//guard-else 提前退出:guard不成立則走else ,成立則走guard結(jié)束大括號(hào)后面的代碼
func testGuardGreet(person:[String: String]){
    guard let name = person["name"] else { //獲取字典中的name
        print("guard語(yǔ)句不成立冤馏,此處也沒(méi)有name這個(gè)變量")
        return
    }
    print("字典中有name:\(name)")
    guard let location = person["location"] else {
        print("字典中沒(méi)有l(wèi)ocation這個(gè)值,此處也無(wú)此變量定義")
        return
    }
    print("字典中既有name也有l(wèi)ocation:\(location)")
}
testGuardGreet(person: ["name":"張三"])
testGuardGreet(person: ["name" : "李四","location":"北京"])

//檢查API是否可用:
if #available(iOS 11, *){
    print("使用#available檢查 一些API是否可用")
}

//=================================while寄啼、repeat-While語(yǔ)句=================================
var n = 2
while n<100 {
    n = n*2
}
print("while循環(huán)結(jié)束后的n的值:\(n)")

var mm = 1
repeat {
    mm = mm*2
}while mm<50
print("repeat-while循環(huán)中逮光,結(jié)束條件后置:\(mm)")

var total = 0
for i in 0..<4 {
    total += i
}
print("循環(huán)的范圍:\(total)")//使用..< 創(chuàng)建的范圍不包含上界,如果想包含的話需要使用...

var total2 = 0
for j in 0...4{
    total2 += j
}
print("包括上界的循環(huán)范圍:\(total2)")

//間隔遍歷:每隔x遍歷一次
for index in stride(from: 0, to: 60, by: 3) { //從0-60 每隔3 遍歷一次
    print("半開(kāi)區(qū)間-間隔遍歷:\(index)") // 0墩划、3涕刚、6、9乙帮、……57 (to不包括60)
}
for index in stride(from: 1, through: 10, by: 2) {//遍歷1-10杜漠,每隔2遍歷一次
    print("閉區(qū)間- 間隔遍歷:\(index)")//1-10: 1、3察净、5驾茴、7、9氢卡; 0-10:0锈至、2、4译秦、6峡捡、8、10
}

/*蛇與梯子(見(jiàn)圖snakesAndLadders_2x的示例:)
    游戲規(guī)則:如果在梯子底部筑悴,會(huì)直接爬到梯子頂部们拙;如果在蛇頭,會(huì)直接滑到蛇尾雷猪;從0開(kāi)始睛竣,每次擲骰子來(lái)決定走幾步
 */
let geNum = 25;//表格的總數(shù)量
var geArr = [Int](repeating: 0, count: geNum+1);//初始化每個(gè)格子的規(guī)則 都為0
geArr[3] = 8 //如果到了格子3晰房,就加8求摇,直接爬到格子11
geArr[6] = 11 //如果到了格子6,就加11殊者,直接爬到格子17
geArr[9] = 9 //如果到了格子9与境,就加9,直接爬到格子18
geArr[10] = 2 //如果到了格子10猖吴,就加2摔刁,直接爬到格子12
geArr[14] = -10 //如果到了格子14,就減10海蔽,會(huì)直接滑到格子4
geArr[19] = -11 //如果到了格子19共屈,就減11绑谣,直接滑到格子8
geArr[22] = -2 //如果到了格子22,就減2拗引,直接滑到格子20
geArr[24] = -8 //如果到了格子24借宵,就減8,直接滑到格子16

var currentGe = 0 //記錄當(dāng)前所在的格子(從0開(kāi)始)
var diceNum = 0 //記錄每次擲骰子的數(shù)(模擬按每次+1:1矾削、2壤玫、3、4哼凯、5欲间、6、1)
while currentGe < geNum { //只要當(dāng)前所在的格子小于25,游戲就沒(méi)有結(jié)束
    diceNum += 1//每次擲骰子數(shù)都在上次擲骰子的數(shù)的基礎(chǔ)上+1
    if diceNum == 7 { //如果超過(guò)了6断部,就回到1猎贴,繼續(xù)
        diceNum = 1
    }
    currentGe += diceNum //每次都往前移動(dòng)擲出來(lái)的骰子數(shù)個(gè)格子

    if currentGe < geArr.count {//如果游戲沒(méi)有結(jié)束
        currentGe += geArr[currentGe]// 額外再滿足一下游戲的規(guī)則(上升或下滑)
        print("當(dāng)前格子數(shù)是:\(currentGe)")
    }
}
print("游戲結(jié)束")

//=================================switch語(yǔ)句=================================
//switch語(yǔ)句:任意類型都可以,匹配上之后會(huì)退出switch蝴光,所以不需要再每個(gè)語(yǔ)句后面加上break;但是每個(gè)case分支后面都必須包含至少一條語(yǔ)句嘱能,否則會(huì)報(bào)錯(cuò),如果語(yǔ)句為空虱疏,就把這個(gè)case條件給去掉惹骂;或者直接寫(xiě)break跳出switch
let tag = "red"
switch tag {
case "red":
    print("顏色為red")
    print("選對(duì)了")
case "green","GREEN": //一個(gè)case語(yǔ)句后面可以同時(shí)匹配多個(gè),用逗號(hào)分隔
    print("顏色為--綠色")
case let x where x.hasSuffix("d")://如果前面都沒(méi)有匹配上做瞪,而且tag的后綴是“d”对粪,就會(huì)走進(jìn)這個(gè)匹配,并將tag的值賦值給常量x在代碼塊中使用
    print("特色的switch-case語(yǔ)句:\(x)")//匹配上x(chóng)的值就是tag的值
default:
    print("沒(méi)有符合的")
}
//case語(yǔ)句也可以是區(qū)間匹配装蓬,例如: case 1..<3: 這種
//switch匹配元組
let somePoint = (1,1)
switch somePoint {//如果條件滿足很多個(gè)case著拭,只會(huì)執(zhí)行第一個(gè)滿足的case,后面的都不會(huì)執(zhí)行
case (0,0):
    print("0牍帚,0")
case (_, 0):
    print("在x軸上")
case (0,_):
    print("在y軸上")
case (-2...2,-2...2):
    print("在一個(gè)封閉的區(qū)間中")
default:
    print("沒(méi)找到")
}

//switch 允許判斷條件為常量或者變量---值綁定
let anotherPoint = (2,0)
switch anotherPoint {
case (let x,0)://匹配一個(gè)y為0的點(diǎn)儡遮,并將這個(gè)點(diǎn)的橫坐標(biāo)傳給x
    print("匹配在x軸上的一個(gè)值:\(x)")
case (0,let y),(let y,0)://匹配一個(gè)x為0的點(diǎn),并將這個(gè)點(diǎn)的縱坐標(biāo)傳給y;后面是一個(gè)復(fù)合匹配暗赶,let定義的變量需要一致才能在下面使用
    print("匹配在y軸上的一個(gè)值:\(y)")
case let(x, y)://匹配任意一個(gè)x,y的點(diǎn)鄙币;由于肯定會(huì)滿足這一條件,所以后面不需要再寫(xiě)默認(rèn)的default分支了
    print("匹配任意一個(gè)點(diǎn)的xy坐標(biāo):\(x,y)")
}

//switch 判斷條件可以用where語(yǔ)句來(lái)增加額外的條件
let yetPoint = (1,-1)
switch yetPoint {
case let (x,y) where x == y://x,y都是占位符蹂随,需要滿足where后面的條件才可以執(zhí)行這個(gè)case
    print("\(x,y)在 x==y 這個(gè)對(duì)角線上")
case let (x,y) where x == -y:
    print("\(x,y)在 x==-y這個(gè)對(duì)角線上")
case let (x,y):
    print("\(x,y)這個(gè)點(diǎn)不在上面那兩條對(duì)角線上")
}

//=================================控制轉(zhuǎn)移語(yǔ)句:=================================
//continue: 本次循環(huán)完成了十嘿,開(kāi)始下一次循環(huán)
let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput {//遍歷字符串
    switch character {
    case "a","e","i","o","u"," "://跳過(guò)元音字符和空格
        continue
    default:
        puzzleOutput.append(character)//把其他的字符拼接到一塊
    }
}
print("拼接后的字符串為:\(puzzleOutput)")

//break:結(jié)束循環(huán),跳到循環(huán)體結(jié)束的大括號(hào)后的第一行代碼
let numberSymbol:Character = "三"
var possibleIntValue: Int?
switch numberSymbol {
case "1","一","壹":
    possibleIntValue = 1
case "二","2","貳":
    possibleIntValue = 2
case "叁","3","三":
    possibleIntValue = 3
default:
    break
}
if let posNum = possibleIntValue {
    print("匹配的結(jié)果為:\(posNum)")
}else{
    print("沒(méi)有匹配上")
}

//fallthrough:貫穿岳锁,會(huì)穿透當(dāng)前绩衷,執(zhí)行下一步
let desNum = 5
var desStr = "數(shù)據(jù)\(desNum),"
switch desNum {
case 2,3,4,5,6:
    desStr += "匹配上了"
    fallthrough
case 0,1,7,8,9:
    desStr += ",case穿透了"
default:
    desStr += "咳燕,default穿透了"
}
print("穿透結(jié)果:\(desStr)")//帶fallthrough語(yǔ)句勿决,會(huì)直接穿透到下一步,而無(wú)視case的條件

//帶標(biāo)簽的語(yǔ)句:為了在前提循環(huán)中很好的區(qū)分是哪個(gè)循環(huán)的break和continue,可以使用一個(gè)標(biāo)簽來(lái)標(biāo)記一個(gè)循環(huán)體或者條件語(yǔ)句
//蛇與梯子的升級(jí)版:剛好落到最后一個(gè)格子才算勝利
let geNum2 = 25;//表格的總數(shù)量
var geArr2 = [Int](repeating: 0, count: geNum2+1);//初始化每個(gè)格子的規(guī)則 都為0
geArr2[3] = 8 //如果到了格子3招盲,就加8剥险,直接爬到格子11
geArr2[6] = 11 //如果到了格子6,就加11宪肖,直接爬到格子17
geArr2[9] = 9 //如果到了格子9表制,就加9,直接爬到格子18
geArr2[10] = 2 //如果到了格子10控乾,就加2么介,直接爬到格子12
geArr2[14] = -10 //如果到了格子14,就減10蜕衡,會(huì)直接滑到格子4
geArr2[19] = -11 //如果到了格子19壤短,就減11,直接滑到格子8
geArr2[22] = -2 //如果到了格子22慨仿,就減2久脯,直接滑到格子20
geArr2[24] = -8 //如果到了格子24,就減8镰吆,直接滑到格子16

var currentGe2 = 0 //記錄當(dāng)前所在的格子(從0開(kāi)始)
var diceNum2 = 0 //記錄每次擲骰子的數(shù)(模擬按每次+1:1帘撰、2、3万皿、4摧找、5、6牢硅、1)
gameLoop: while currentGe2 != geNum2 { //該循環(huán)的標(biāo)簽為gameLoop,只要當(dāng)前格子不在終點(diǎn)格子上就循環(huán)
    diceNum2 += 1//每次擲骰子數(shù)都在上次擲骰子的數(shù)的基礎(chǔ)上+1
    if diceNum2 == 7 { //如果超過(guò)了6蹬耘,就回到1,繼續(xù)
        diceNum2 = 1
    }
    switch currentGe2 + diceNum2 {//當(dāng)前格子數(shù) + 骰子數(shù)
    case geNum2://正好在終點(diǎn)格子上
        break gameLoop //結(jié)束gameLoop的while循環(huán)(如果break后面沒(méi)有帶上while循環(huán)的標(biāo)簽gameLoop减余,那么他僅僅是中斷了switch語(yǔ)句)
    case let newSquare where newSquare > geNum2: //超過(guò)了終點(diǎn)格子--啥也不做综苔,下一次循環(huán)
        continue gameLoop //結(jié)束本輪gameLoop循環(huán),開(kāi)始下一次gameLoop循環(huán)
    default://沒(méi)有到終點(diǎn)位岔、也沒(méi)有超過(guò)終點(diǎn)
        currentGe2 += diceNum2 //每次都往前移動(dòng)擲出來(lái)的骰子數(shù)個(gè)格子
        if currentGe2 < geArr2.count {//如果游戲沒(méi)有結(jié)束
            currentGe2 += geArr2[currentGe2]// 額外再滿足一下游戲的規(guī)則(上升或下滑)
            print("當(dāng)前格子數(shù)是:\(currentGe2)")
        }
    }
}
print("帶標(biāo)簽的游戲結(jié)束")

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末如筛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赃承,更是在濱河造成了極大的恐慌妙黍,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧剖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抓于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門做粤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捉撮,你說(shuō)我怎么就攤上這事怕品。” “怎么了巾遭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵肉康,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我灼舍,道長(zhǎng)吼和,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任骑素,我火速辦了婚禮炫乓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘献丑。我一直安慰自己末捣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布创橄。 她就那樣靜靜地躺著箩做,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妥畏。 梳的紋絲不亂的頭發(fā)上卒茬,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音咖熟,去河邊找鬼圃酵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛馍管,可吹牛的內(nèi)容都是我干的郭赐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼确沸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捌锭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罗捎,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤观谦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桨菜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豁状,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捉偏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泻红。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夭禽。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谊路,靈堂內(nèi)的尸體忽然破棺而出讹躯,到底是詐尸還是另有隱情,我是刑警寧澤缠劝,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布潮梯,位于F島的核電站,受9級(jí)特大地震影響惨恭,放射性物質(zhì)發(fā)生泄漏秉馏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一喉恋、第九天 我趴在偏房一處隱蔽的房頂上張望沃饶。 院中可真熱鬧,春花似錦轻黑、人聲如沸糊肤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馆揉。三九已至,卻和暖如春抖拦,著一層夾襖步出監(jiān)牢的瞬間升酣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工态罪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留噩茄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓复颈,卻偏偏與公主長(zhǎng)得像绩聘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耗啦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容