亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > Swift > 正文

Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解

2020-03-09 17:52:06
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解,文中還使用了一個(gè)游戲例子來講解循環(huán)語(yǔ)句和判斷語(yǔ)句的使用,需要的朋友可以參考下
 

Swift提供了所有c類語(yǔ)言的控制流結(jié)構(gòu)。包括for和while循環(huán)來執(zhí)行一個(gè)任務(wù)多次;if和switch語(yǔ)句來執(zhí)行確定的條件下不同的分支的代碼;break和continue關(guān)鍵字能將運(yùn)行流程轉(zhuǎn)到你代碼的另一個(gè)點(diǎn)上。

除了C語(yǔ)言傳統(tǒng)的for-condition-increment循環(huán),Swift加入了for-in循環(huán),能更加容易的遍歷arrays, dictionaries, ranges, strings等其他序列類型。

Swift的switch語(yǔ)句也比C語(yǔ)言的要強(qiáng)大很多。 Swift中switch語(yǔ)句的case語(yǔ)句不會(huì)“掉入”下一個(gè)case,避免了c語(yǔ)言忘記寫break語(yǔ)句產(chǎn)生的錯(cuò)誤。 case可以匹配許多不同的模式,包括范圍匹配,元組匹配或者拋給指定的類型。匹配值在一個(gè)case條件下可以綁定到臨時(shí)常量或變量,可以在case的代碼塊中使用,復(fù)雜匹配條件下可以表示為每一個(gè)case的條件

一、For Loops - For循環(huán)

for循環(huán)用來多次執(zhí)行一組語(yǔ)句 ,Swift提供了兩種形式:

1.for-in執(zhí)行范圍,序列,集合或級(jí)數(shù)等每一項(xiàng)中的一組語(yǔ)句
2.for-condition-increment執(zhí)行一組語(yǔ)句直到確定的條件出現(xiàn),通常在每一個(gè)循環(huán)結(jié)束前遞增一個(gè)計(jì)數(shù)

For-In循環(huán)

使用for-in來遍歷集合中的項(xiàng)目,比如數(shù)組的范圍,排列中的項(xiàng)或者字符串中的字符。

下面的例子打印了表中的5個(gè)元素

復(fù)制代碼代碼如下:

 for index in 1...5 {
     println("/(index) times 5 is /(index * 5)")
 }
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
 // 4 times 5 is 20
// 5 times 5 is 25

例子中被迭代集合的項(xiàng)是一個(gè)封閉范圍內(nèi)從1到5的數(shù)字,就是上面標(biāo)識(shí)為封閉范圍操作符的 (...)。 Index的值被設(shè)為第一個(gè)數(shù)據(jù)的范圍(1), 然后執(zhí)行循環(huán)中的語(yǔ)句。在本例中,循環(huán)只包含了一句話,根據(jù)index現(xiàn)有的值打印5次乘法表的一個(gè)結(jié)果。當(dāng)執(zhí)行完語(yǔ)句之后,index的值被更新為范圍中的第二個(gè)值,然后再次調(diào)用println函數(shù)。這個(gè)操作會(huì)一直持續(xù),直到范圍的終點(diǎn)。

 

在上面的例子中,index是一個(gè)常量,它的值在每次迭代的開始時(shí)自動(dòng)初始化,使用前不會(huì)被聲明,就是簡(jiǎn)單的將其隱性聲明納入循環(huán)的聲明,不需要使用let來聲明關(guān)鍵字。

 

復(fù)制代碼代碼如下:

NOTE:
Index常量?jī)H僅存在于循環(huán)的范圍內(nèi)。如果你想要在循環(huán)之后得到index的值,或者想要使用index的值作為變量,你必須在循環(huán)之前聲明它。

 

如果不需要范圍的值,可以用下劃線替代變量名來忽略這些值:

復(fù)制代碼代碼如下:

 let base = 3
 let power = 10
 var answer = 1
 for _ in 1...power {
     answer *= base
 }
 println("/(base) to the power of /(power) is /(answer)")
 // prints "3 to the power of 10 is 59049"

例子中計(jì)算兩數(shù)相乘(在本例中,3乘以10)。乘法初始值為1,每次乘3,乘10次,使用半封閉循環(huán)從0到9。這個(gè)計(jì)算不需要通過循環(huán)來知道每個(gè)計(jì)數(shù)器的值--僅僅只需要執(zhí)行正確的循環(huán)次數(shù)。下劃線操作符 _ (用于替代循環(huán)變量)將忽略掉個(gè)體值,并且在每一次循環(huán)迭代期間不給現(xiàn)有的變量提供訪問。

 

使用for-in循環(huán)來迭代出array中的每一個(gè)項(xiàng):

復(fù)制代碼代碼如下:

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    println("Hello, /(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

同樣可以迭代字典來訪問其中的鍵值對(duì)。當(dāng)?shù)值鋾r(shí)里面的每一個(gè)項(xiàng)都以(key,value)元組的形式來返回,你可以在for-in的循環(huán)體中分解 (key, value) 元組的成員,把成員作為顯性命名的常量來使用。下面例子,字典的key被分解為animalName的常量,字典的值被分解名為legCount的常量:
復(fù)制代碼代碼如下:

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
println("/(animalName)s have /(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs

Dictionary中的項(xiàng)的迭代順序可能跟它們插入時(shí)的順序不一樣。因?yàn)镈ictionary中的內(nèi)容本質(zhì)上是無序的,所以迭代它們不能保證檢索時(shí)的順序。更多關(guān)于排列和字典的內(nèi)容詳見 Collection Types章節(jié)。

 

除了排列和字典,for-in循環(huán)還能迭代字符串中的Character(字符):

復(fù)制代碼代碼如下:

for character in "Hello" {
    println(character)
}
// H
// e
// l
// l
// o

 

For-Condition-Increment For-條件-遞增

除了for-in循環(huán),Swift還支持傳統(tǒng)C語(yǔ)言按條件遞增的for循環(huán)

復(fù)制代碼代碼如下:

for var index = 0; index < 3; ++index {
    println("index is /(index)")
}
// index is 0
// index is 1
// index is 2

這是常用的形式:
復(fù)制代碼代碼如下:

for <initialization>; <condition>; <increment> {
    <statements>
}

封號(hào)把循環(huán)定義隔為了三個(gè)部分,跟C語(yǔ)言一樣。然而與C不同的是,Swift不需要用括號(hào)把 “初始化; 條件; 增量” 的代碼塊包起來。

 

循環(huán)按照下面流程執(zhí)行:

1.當(dāng)循環(huán)第一次進(jìn)入,initialization expression(初始化表達(dá)式)計(jì)算一次,設(shè)置好循環(huán)所需的常量或者變量。

2.計(jì)算condition expression(條件表達(dá)式)。如果計(jì)算結(jié)果為false(假),循環(huán)終止,并繼續(xù)執(zhí)行for循環(huán)尾括號(hào)(})后面的代碼。如果結(jié)果為(true)真,則執(zhí)行循環(huán)體大括號(hào)內(nèi)的代碼。

3.在所有的語(yǔ)句執(zhí)行完后,計(jì)算increment expression(增量表達(dá)式)。計(jì)數(shù)器可能遞增或遞減,也可能根據(jù)語(yǔ)句執(zhí)行的結(jié)果將初始化變量設(shè)為新的值。計(jì)算完增量表達(dá)式返回到第2步,條件表達(dá)式再次被計(jì)算。

上面描述的循環(huán)體的形式和執(zhí)行過程可以簡(jiǎn)單的等同于:

復(fù)制代碼代碼如下:

<initialization>
while <condition> {
    <statements>
    <increment>
}

 

常量和變量在初始化表達(dá)式中的聲明(比如var index = 0)只在for循環(huán)自己內(nèi)部有效。如果需要知道index最終的值,必須在循環(huán)開始前聲明index:

復(fù)制代碼代碼如下:

var index: Int
for index = 0; index < 3; ++index {
    println("index is /(index)")
}
// index is 0
// index is 1
// index is 2
println("The loop statements were executed /(index) times")
// prints "The loop statements were executed 3 times"

注意,循環(huán)完成后index最終的值是3,不是2。最后一次執(zhí)行增量表達(dá)式調(diào)用了++index,把index設(shè)為3,使得index<3等于false,循環(huán)結(jié)束。

 

二、While Loops - While循環(huán)

while循環(huán)在條件變?yōu)閒alse前執(zhí)行一組語(yǔ)句,這類循環(huán)最好用在第一個(gè)迭代開始前并不知道迭代器的數(shù)字的時(shí)候。Swift提供了兩種while循環(huán):

1.while 在每次通過循環(huán)的開頭計(jì)算條件
2.do-while 在每次通過循環(huán)的結(jié)尾計(jì)算條件

while循環(huán)

一個(gè)while循環(huán)開始于計(jì)算單個(gè)的條件,如果條件為true,一組語(yǔ)句將重復(fù)直到條件變?yōu)閒alse。

這是常見的while形式:

復(fù)制代碼代碼如下:

while <condition> {
    <statements>
}

 

比如,玩這個(gè)叫Snakes and Ladders的游戲(或Chutes and Ladders):

Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解

游戲的規(guī)則是這樣的:

1.板子上有25個(gè)矩形,然后目標(biāo)是到達(dá)或超越25號(hào)方塊。
2.每一輪,你先搖六面骰子,然后按照水平方向的虛線箭頭移動(dòng)到對(duì)應(yīng)數(shù)字的方塊上。
3.如果走完落在梯子的底部,你可以爬上梯子。
4.如果走完落在蛇的頭部,你可以走到那條蛇的尾部。

這個(gè)游戲板由一個(gè)Int型數(shù)組展示出來。它的大小基于finalSquare常量,該常量用來初始化數(shù)組并在之后檢查勝利條件。游戲板初始化為26個(gè)值為0的Int型數(shù)據(jù),不是25個(gè)(分別位于0至25的索引):

復(fù)制代碼代碼如下:

let finalSquare = 25
var board = Int

一些方塊給蛇與梯子設(shè)有具體的值。游戲板里,你能在有方塊有梯子腳的地方向上移動(dòng)正數(shù),而有蛇頭的地方你只能向下移動(dòng)負(fù)數(shù):
復(fù)制代碼代碼如下:

board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08

方塊3有梯子腳,所以你可以移動(dòng)到方塊11。為了表述這個(gè)動(dòng)作,board[03]等于+08,等同于一個(gè)整型數(shù)值8(即3和11的差)。一元運(yùn)算符加運(yùn)算符(+i)與一元減運(yùn)算符(-i)相平衡,如果數(shù)值小于10就用0替代,這樣所板上的定義就對(duì)齊了。(風(fēng)格調(diào)整不是必須的,但代碼簡(jiǎn)潔很有必要)

 

玩家開始于方塊0,就在游戲板左下角的外面。第一下投骰是把玩家?guī)У接螒虬胬锩妫?/p>

復(fù)制代碼代碼如下:

var square = 0
var diceRoll = 0
while square < finalSquare {
    // roll the dice
    if ++diceRoll == 7 { diceRoll = 1 }
    // move by the rolled amount
    square += diceRoll
    if square < board.count {
        // if we're still on the board, move up or down for a snake or a     ladder
    square += board[square]
    }
}
println("Game over!")

這個(gè)例子很簡(jiǎn)單的模擬了投骰子。用隨機(jī)數(shù)的生成器來替代,diceRoll從0開始。每一個(gè)while循環(huán),diceRoll通過自加運(yùn)算符(++i)遞增,然后檢查是否過大。++diceRoll的返回值等于diceRoll自加以后的值。如果返回值等于7,骰子值則過大,重設(shè)為1。這樣diceRoll的值會(huì)一直是1,2,3,4,5,6,1,2等等。

 

在搖骰子后,玩家根據(jù)diceRoll移動(dòng)方塊。有可能骰子的數(shù)會(huì)讓玩家超過方塊25,這樣就算游戲結(jié)束。為了描述這個(gè)場(chǎng)景,代碼在向board[square]添加值以前先檢查square的值是否少于board數(shù)組的count屬性,如果是則根據(jù)現(xiàn)有的square值將玩家上移或下移到相應(yīng)梯子或蛇。

如果不執(zhí)行這個(gè)檢查,board[square]會(huì)可能嘗試取得board數(shù)組界限外的值,導(dǎo)致越界。如果square現(xiàn)在等于26,代碼將嘗試檢查board[26],這個(gè)值超過了數(shù)組限制。

現(xiàn)有的While循環(huán)執(zhí)行到最后,會(huì)檢查循環(huán)條件看循環(huán)是否會(huì)再次執(zhí)行。如果玩家已經(jīng)移動(dòng)或者方塊超過25,循環(huán)條件會(huì)計(jì)算為false,游戲結(jié)束。

在這個(gè)例子中使用While循環(huán)是比較合適的,因?yàn)橛螒虻拈L(zhǎng)度在循環(huán)的開頭不明確,讓循環(huán)一直執(zhí)行直到特定的滿足條件出現(xiàn)。

Do-While循環(huán)

While循環(huán)的另一個(gè)形式是do-while,在考慮循環(huán)條件前先執(zhí)行一次整個(gè)循環(huán)體,然后再繼續(xù)重復(fù)循環(huán)直到條件為false。

下面是do-while的常見形式:

復(fù)制代碼代碼如下:

do {
   <statements>
} while <condition>

再來看看Snakes and Ladders的例子,用do-while而不是while來實(shí)現(xiàn)。finalSquare, board, square, 和diceRoll都用相同的方式初始化:
復(fù)制代碼代碼如下:

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0

在這個(gè)版本的游戲中,循環(huán)中第一個(gè)操作是檢查一個(gè)梯子或蛇。沒有梯子能直接把玩家?guī)У椒綁K25,所以不可能只爬一個(gè)梯子就贏了。因此在循環(huán)里先檢查梯子或蛇會(huì)更安全。

 

游戲的開始,玩家在“方塊0”。 board[0]永遠(yuǎn)等于0,沒有別的功能:

復(fù)制代碼代碼如下:

do {
    // move up or down for a snake or ladder
    square += board[square]
    // roll the dice
    if ++diceRoll == 7 { diceRoll = 1 }
    // move by the rolled amount
    square += diceRoll
} while square < finalSquare
println("Game over!")

在代碼檢查后,開始搖骰子,玩家通過diceRoll方塊向前移動(dòng),該循一直環(huán)執(zhí)行到最后。

 

循環(huán)條件(while square < finalSquare)跟之前例子一樣,但是這次會(huì)在第一次循環(huán)的結(jié)尾才計(jì)算。do-while循環(huán)的結(jié)構(gòu)比while循環(huán)更適合本例。上面do-while中,在循環(huán)條件確認(rèn)square仍舊在游戲板里面后,square += board[square]會(huì)直接進(jìn)行計(jì)算,不必進(jìn)行數(shù)組越界的檢查。

三、Conditional Statements - 條件語(yǔ)句

編程中常常根據(jù)不同的條件執(zhí)行不同的代碼,你可能會(huì)要代碼在出錯(cuò)后運(yùn)行額外的語(yǔ)句,或者當(dāng)數(shù)值越界時(shí)展示一個(gè)消息。我們可以用conditional(條件)來實(shí)現(xiàn)。

Swift提供兩種方式來添加代碼的分支,常見的if和switch語(yǔ)句。顯然,用if語(yǔ)句來計(jì)算只有少量分支的的條件,而Switch用于更復(fù)雜的情況,特別是在模式匹配的時(shí)候有助于選擇合適的代碼分支來執(zhí)行。

If語(yǔ)句

在下面最簡(jiǎn)單的例子里,if語(yǔ)句有一個(gè)if條件。所有的語(yǔ)句都只有在if條件為true的情況下才執(zhí)行:

復(fù)制代碼代碼如下:

 var temperatureInFahrenheit = 30
 if temperatureInFahrenheit <= 32 {
     println("It's very cold. Consider wearing a scarf.")
 }
 // prints "It's very cold. Consider wearing a scarf."

前面的例子檢查了溫度是否等于32攝氏度。如果是則打印消息。否則不打印消息,直接執(zhí)行if語(yǔ)句大括號(hào)后面的代碼。

 

if語(yǔ)句可以提供一個(gè)二選一的語(yǔ)句,常見的:else clause,用于當(dāng)if條件為false時(shí)。這些語(yǔ)句用else關(guān)鍵字來控制:

復(fù)制代碼代碼如下:

 temperatureInFahrenheit = 40
 if temperatureInFahrenheit <= 32 {
     println("It's very cold. Consider wearing a scarf.")
 } else {
     println("It's not that cold. Wear a t-shirt.")
 }
 // prints "It's not that cold. Wear a t-shirt."

兩個(gè)大括號(hào)中的一個(gè)被執(zhí)行。因?yàn)闇囟仍黾映^了40攝氏度,已經(jīng)不需要建議去帶圍巾,所以else分支被觸發(fā)。

 

你可以使用多個(gè)if語(yǔ)句,像這樣增加條件:

復(fù)制代碼代碼如下:

 temperatureInFahrenheit = 90
 if temperatureInFahrenheit <= 32 {
     println("It's very cold. Consider wearing a scarf.")
 } else if temperatureInFahrenheit >= 86 {
     println("It's really warm. Don't forget to wear sunscreen.")
 } else {
     println("It's not that cold. Wear a t-shirt.")
 }
 // prints "It's really warm. Don't forget to wear sunscreen."

這里增加的if語(yǔ)句用于應(yīng)對(duì)極端炎熱的情況。最后的else條件保留,打印既不冷也不熱的情況。

 

最后的else條件是可選的,因此如果不需要寫完整可以去掉。

復(fù)制代碼代碼如下:

    temperatureInFahrenheit = 72
 if temperatureInFahrenheit <= 32 {
     println("It's very cold. Consider wearing a scarf.")
 } else if temperatureInFahrenheit >= 86 {
     println("It's really warm. Don't forget to wear sunscreen.")
 }

在這個(gè)例子中,溫度既不冷也不熱才能觸發(fā)if或者else條件來打印信息。

 

Switch語(yǔ)句

Switch語(yǔ)句用一個(gè)值來匹配相對(duì)應(yīng)的幾個(gè)匹配模式。然后執(zhí)行相對(duì)應(yīng)的代碼塊,基于一開始匹配成功的模式。switch語(yǔ)句提供了應(yīng)對(duì)多種選擇情況的處理來替代if語(yǔ)句。

最簡(jiǎn)單的形式,switch比較一個(gè)值對(duì)應(yīng)的一個(gè)或者多個(gè)相同形式的值:

復(fù)制代碼代碼如下:

 switch some value to consider {
 case value 1:
     respond to value 1
 case value 2,
 value 3:
     respond to value 2 or 3
 default:
     otherwise, do something else
 }

每個(gè)switch語(yǔ)句由多個(gè)可能的case(情況)構(gòu)成,都用標(biāo)記的case關(guān)鍵字開頭。除了比較對(duì)應(yīng)的值,Swift還為每種case應(yīng)對(duì)更復(fù)雜的匹配模式提供了幾種方法,后面章節(jié)再說。

 

每一個(gè)switch語(yǔ)句都必須exhaustive(詳細(xì)),并且每一個(gè)所考慮類選可能的值都必須匹配switch中的一個(gè)case。如果不能對(duì)應(yīng)到switch中的所有case的值,可以定義個(gè)默認(rèn)的選取器來解決。選取器用default關(guān)鍵字來表示,必須出現(xiàn)在最后。

下面的例子用switch語(yǔ)句匹配了一個(gè)小寫字符,someCharacter:

復(fù)制代碼代碼如下:

 let someCharacter: Character = "e"
 switch someCharacter {
 case "a", "e", "i", "o", "u":
     println("/(someCharacter) is a vowel")
 case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
 "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
     println("/(someCharacter) is a consonant")
 default:
     println("/(someCharacter) is not a vowel or a consonant")
 }
 // prints "e is a vowel"

Switch語(yǔ)句第一個(gè)case匹配了5個(gè)小寫的元音字母。相似地,第二個(gè)case匹配所有的輔音小寫字母。

 

case中并不需要寫上所有其他的英語(yǔ)字母,所以switch提供了default來匹配其他所有不是元音也不是輔音的情況。這樣的條件保證了switch沒有遺漏。

No Implicit Fallthrough - 沒有隱性掉入

相比C和objective-c中的switch語(yǔ)句,Swift中(如果忘了寫break)的switch不會(huì)默認(rèn)的掉落到每個(gè)case的下面進(jìn)入另一個(gè)case。相反,switch語(yǔ)句當(dāng)?shù)谝粋€(gè)遇到的case完成時(shí)就完成了它整個(gè)的執(zhí)行,不需要寫break。因此比起C語(yǔ)言,swift的switch更加安全和簡(jiǎn)單,避免了執(zhí)行多個(gè)case的錯(cuò)誤。

 NOTE:
 如果你需要,仍舊可在case執(zhí)行完以前跳出來,詳見:[Break in a Switch Statement]見下面章節(jié)
每個(gè)case的主干包括只少一個(gè)可執(zhí)行的語(yǔ)句。下面這樣寫是無效的,因?yàn)榈谝粋€(gè)case是空的:

復(fù)制代碼代碼如下:

let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a":
case "A":
    println("The letter A")
default:
    println("Not the letter A")
}
// this will report a compile-time error

不像C語(yǔ)言中的Switch,這里的switch語(yǔ)句不能匹配"a"和"A"。比如,case "a"會(huì)在編譯時(shí)報(bào)錯(cuò):沒有找到任何可執(zhí)行語(yǔ)句。盡可能的避免了意外從一個(gè)case掉入另一個(gè),這樣使代碼更安全。

 

如果有多個(gè)匹配對(duì)象的,可以用逗號(hào)隔開,像下面這樣寫成多行:

復(fù)制代碼代碼如下:

switch some value to consider {
case value 1,
value 2:
    statements
}

 

 

復(fù)制代碼代碼如下:

NOTE:
為特別的switch case選擇掉落行為,可以使用fallthrough關(guān)鍵字,在下文中詳解

 

Range Matching - 范圍匹配

switch中case的值可以檢查他們內(nèi)在的范圍。這個(gè)例子使用數(shù)字范圍可以提供任意大小數(shù)字的自然語(yǔ)言計(jì)數(shù)。

復(fù)制代碼代碼如下:

let count = 3_000_000_000_000
let countedThings = "stars in the Milky Way"
var naturalCount: String
switch count {
case 0:
    naturalCount = "no"
case 1...3:
    naturalCount = "a few"
case 4...9:
    naturalCount = "several"
case 10...99:
    naturalCount = "tens of"
case 100...999:
    naturalCount = "hundreds of"
case 1000...999_999:
    naturalCount = "thousands of"
default:
    naturalCount = "millions and millions of"
}
println("There are /(naturalCount) /(countedThings).")
// prints "There are millions and millions of stars in the Milky Way."

 

Tuples 元組

你可以使用元組在相同的switch語(yǔ)句中測(cè)試多個(gè)值。每一個(gè)元組中的元素都可以試著和范圍中不同的值進(jìn)行匹配。另外,用下劃線(_)標(biāo)示符來匹配任意可能的值。

下面例子中使用一個(gè)點(diǎn)坐標(biāo)(x,y),用元組型(Int, Int)來表示,可以在下面的圖中分類出來:

復(fù)制代碼代碼如下:

let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    println("(0, 0) is at the origin")
case (_, 0):
    println("(/(somePoint.0), 0) is on the x-axis")
case (0, _):
    println("(0, /(somePoint.1)) is on the y-axis")
case (-2...2, -2...2):
    println("(/(somePoint.0), /(somePoint.1)) is inside the box")
default:
    println("(/(somePoint.0), /(somePoint.1)) is outside of the box")
}
// prints "(1, 1) is inside the box"

 

Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解

Switch語(yǔ)句決定了點(diǎn)是否在原點(diǎn)(0,0)上,在紅色的x軸上,在橙色的y軸上,在藍(lán)色4X4的矩形為中心的原點(diǎn)內(nèi),或者在矩形外。

與C語(yǔ)言不同,Swift允許多個(gè)switch的case考慮相同的值。實(shí)際上點(diǎn)(0,0)能匹配例子中所有的四個(gè)case。然而,如果多個(gè)匹配出現(xiàn),第一個(gè)匹配成功的case將被使用。點(diǎn)(0,0)能首先匹配case(0,0),所以其他所有的case將被忽略。

Value Bindings 值綁定

一個(gè)switch的case能綁定用于匹配臨時(shí)常量或變量值,在case的分支代碼里使用。這就是value binding(值綁定),因?yàn)檫@些值在case的代碼體中是臨時(shí)常量或變量的“邊界”。

下面的例子有一個(gè)點(diǎn)(x,y),用元組型(Int,Int)來表示,在圖種展示出來如下:

復(fù)制代碼代碼如下:

let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    println("on the x-axis with an x value of /(x)")
case (0, let y):
    println("on the y-axis with a y value of /(y)")
case let (x, y):
    println("somewhere else at (/(x), /(y))")
}
// prints "on the x-axis with an x value of 2

 

Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解

switch語(yǔ)句來確定點(diǎn)是否在紅色x軸上,在橙色y軸,或者其他地方。

三個(gè)switch的case都聲明了占位常量x和y,暫時(shí)從anotherPoint占用一個(gè)或兩個(gè)元組值。第一個(gè)case里,case (let x, 0),匹配給任意一個(gè)y值為0,并分派點(diǎn)的x值給臨時(shí)常量x的點(diǎn)。相似地,第二個(gè)case,case (0, let y),匹配給一個(gè)x值為0,分派點(diǎn)的y值給臨時(shí)常量y的點(diǎn)。

一旦臨時(shí)常量被聲明,他們將在case的代碼塊中使用。這里他們將作為簡(jiǎn)寫在println函數(shù)中打印出來。

注意switch語(yǔ)句沒有default的case。最后一個(gè)case,case let (x, y),聲明了包含兩個(gè)占位常量可以匹配任何值的元組。作為結(jié)果,它匹配任何可能的值,不需要default語(yǔ)句switch就足夠完美了。

上面的例子中,聲明x和y用了關(guān)鍵詞let,因?yàn)檫@里不需要在case的代碼段里改變它們的值。然而,他們可以用變量來代替,使用var關(guān)鍵詞。如果用了變量,則會(huì)創(chuàng)建臨時(shí)變量并初始化為合適的值。任何對(duì)變量的改變都只會(huì)影響case代碼段中的部分。

Where語(yǔ)句

switch的case能使用where子句來進(jìn)一步判斷條件。 下面的例子將點(diǎn)(x,y)在下圖種分類:

復(fù)制代碼代碼如下:

let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    println("(/(x), /(y)) is on the line x == y")
case let (x, y) where x == -y:
    println("(/(x), /(y)) is on the line x == -y")
case let (x, y):
    println("(/(x), /(y)) is just some arbitrary point")
}
// prints "(1, -1) is on the line x == -y"

 

Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解

switch語(yǔ)句判斷了點(diǎn)是否在綠色斜線上且x == y,或在紫色斜線上且x == -y,或都不是。

三個(gè)switch的case聲明了占位常量x和y,臨時(shí)占用point中元組值。這些常量作為where子句的一部分,用來創(chuàng)建動(dòng)態(tài)的篩選。只有當(dāng)where子句的條件結(jié)果為true,Switch的case則會(huì)匹配現(xiàn)有point的值。

就像在前一個(gè)例子中,最后的case匹配所有可能的值,所以不需要default。

Control Transfer Statements - 控制轉(zhuǎn)移語(yǔ)句

控制轉(zhuǎn)移語(yǔ)句能改變已經(jīng)執(zhí)行代碼的順序,能使代碼跳轉(zhuǎn)到別的部分。Swift有四個(gè)句子:

1.continue
2.break
3.fallthrough
4.return

control, break和fallthrough在下文中詳解。reture語(yǔ)句在Functions中描述。

Continue

Continue語(yǔ)句告訴循環(huán)體終止現(xiàn)在的操作,然后開始迭代下一個(gè)循環(huán)。好像在說“我這次迭代做完啦”,總之不會(huì)離開循環(huán)體。

 

復(fù)制代碼代碼如下:

NOTE:
在for-condition-increment循環(huán)中,調(diào)用了continue后累加器依舊會(huì)計(jì)算。循環(huán)會(huì)繼續(xù)像平時(shí)一樣工作,只有循環(huán)體中的代碼會(huì)被跳過。

 

下面例子中從一個(gè)小寫字符串中移除了所有的元音和空格,創(chuàng)建了個(gè)字謎短語(yǔ):

復(fù)制代碼代碼如下:

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput {
    switch character {
    case "a", "e", "i", "o", "u", " ":
        continue
    default:
        puzzleOutput += character
    }
}
println(puzzleOutput)
// prints "grtmndsthnklk"

上面代碼里,只要匹配到元音字母或空格,就會(huì)觸發(fā)continue關(guān)鍵字。使本次迭代立即終止,然后直接跳入下次迭代的開頭。這個(gè)方式使得switch代碼塊能匹配(和忽略)元音字母與空格,比用代碼塊把每一個(gè)要打印字符都匹配一次的好。

 

Break

Break語(yǔ)句能立即終止整個(gè)控制流??梢愿鶕?jù)你想要的在switch或循環(huán)語(yǔ)句里的任何地方終止整個(gè)執(zhí)行。

Break in a Loop Statement - 循環(huán)中的Break

當(dāng)在循環(huán)體中使用break,循環(huán)會(huì)立即停止,并將控制流帶到循環(huán)體括號(hào)(})后方的第一行代碼里。循環(huán)體里其他的代碼不會(huì)被執(zhí)行,也不會(huì)開始下一次迭代。

Break in a Switch Statement - Switch中的break

在switch里使用break,switch語(yǔ)句會(huì)立即終止,并將控制流帶到switch語(yǔ)句括號(hào)(})后方的第一行代碼里。

這種特性可以用于switch里匹配(或忽略)一個(gè)或多個(gè)case。因?yàn)镾wift的switch是窮舉的,并且不允許有空case的,有時(shí)候要慎重的匹配和為了使意圖明顯而忽略了case。當(dāng)switch匹配了break語(yǔ)句,case中的break能直接終止整個(gè)switch。

 

復(fù)制代碼代碼如下:

NOTE:
一個(gè)switch的case只能包含一個(gè)作為編譯錯(cuò)誤的注釋。注釋不是語(yǔ)句,不會(huì)導(dǎo)致switch的case被忽略。只能使用break語(yǔ)句來跳過case。

 

下面的例子中switch有一個(gè)字符值,并且判斷四種語(yǔ)言之一中是否有數(shù)字符號(hào)。一個(gè)簡(jiǎn)單的switch中包含了多個(gè)值:

復(fù)制代碼代碼如下:

let numberSymbol: Character = "三"  // Simplified Chinese for the number 3
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "?", "一", "?":
    possibleIntegerValue = 1
case "2", "?", "二", "?":
    possibleIntegerValue = 2
case "3", "?", "三", "?":
    possibleIntegerValue = 3
case "4", "?", "四", "?":
    possibleIntegerValue = 4
default:
    break
}
if let integerValue = possibleIntegerValue {
    println("The integer value of /(numberSymbol) is /(integerValue).")
} else {
    println("An integer value could not be found for /(numberSymbol).")
}
    // prints "The integer value of 三 is 3."

例子中通過檢查numberSymbol判斷是否是拉丁語(yǔ),阿拉伯語(yǔ),中文或者泰文符號(hào)來得到1至4的數(shù)字。如果匹配成功,其中的一個(gè)case里會(huì)賦給可選型Int變量possibleIntegerValue一個(gè)合適的整型值。

 

在switch語(yǔ)句執(zhí)行完成后,例子里用了可選型綁定來確定值是否被發(fā)現(xiàn)。possibleIntegerValue變量有一個(gè)隱性的初始值nil,具有可選型的優(yōu)點(diǎn)。只有在前四個(gè)case中,當(dāng)possibleIntegerValue被賦了實(shí)際的值可選綁定才會(huì)成功。

在上面例子中列出所有可能的字符值不太實(shí)際,所以default能提供一個(gè)沒任何字符被選中情況下的容器。這的default不用執(zhí)行任何操作,只寫個(gè)簡(jiǎn)單的break。一旦default被匹配,break語(yǔ)句立即終止switch,并繼續(xù)執(zhí)行 if let語(yǔ)句。

Fallthrough

Swift中的Switch不會(huì)掉下到case的下方并進(jìn)入下一個(gè)case。因此,整個(gè)switch語(yǔ)句毀在第一個(gè)匹配的case完成后結(jié)束。相反,C語(yǔ)言要求你在每個(gè)case的末尾插入一個(gè)break來防止掉入。相比于C語(yǔ)言,Swift的switch禁止默認(rèn)掉入讓更加簡(jiǎn)潔和可控,這樣避免了執(zhí)行多個(gè)case的錯(cuò)誤。

如果你確實(shí)需要C式的掉入特性,你可以使用fallthrough關(guān)鍵詞。下面的例子用fallthrough來創(chuàng)建一段描述數(shù)字的文本:

復(fù)制代碼代碼如下:

let integerToDescribe = 5
var description = "The number /(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
default:
    description += " an integer."
}
println(description)
// prints "The number 5 is a prime number, and also an integer."

例子中聲明了一個(gè)名為description的String型變量并分派一個(gè)初始值。然后函數(shù)用switch匹配integerToDescribe的值。如果integerToDescribe的值符合素?cái)?shù)列表中的一項(xiàng),最后的description會(huì)增加一段字符,注意數(shù)字都是素?cái)?shù)。然后用fallthrough關(guān)鍵字讓代碼“掉到”default里。default的代碼中再額外的給字符串添加些描述,最后switch結(jié)束。

 

如果integerToDescribe不跟素?cái)?shù)表中任何一項(xiàng)匹配,那根本就不會(huì)匹配switch的第一個(gè)case。這里面沒有其他的case,因此integerToDescribe直接進(jìn)入default容器。

在switch執(zhí)行完成后,數(shù)字的描述用println函數(shù)打印出來。在本例中,5是正確的答案。

 

復(fù)制代碼代碼如下:

NOTE:
fallthrough關(guān)鍵字不檢查case里的條件,會(huì)直接掉入下一個(gè)case。fallthrough簡(jiǎn)單的讓代碼執(zhí)行到下一個(gè)case(或default)的代碼塊中,和標(biāo)準(zhǔn)C語(yǔ)言的特性一樣。

 

Labeled Statements - 標(biāo)簽語(yǔ)句

你可以嵌套循環(huán)或在switch語(yǔ)句中嵌套其他的循環(huán),Swift語(yǔ)句種的switch可以創(chuàng)建復(fù)雜的控制流結(jié)構(gòu)。 然而,循環(huán)和switch語(yǔ)句都可以過早地使用break。因此,有時(shí)明確的使用break來終止代碼很有用。類似的,如果你有多個(gè)嵌套的循環(huán),continue會(huì)更有用。

為了做到這一點(diǎn),你可以用statement label來標(biāo)記循環(huán)或switch,與break或continue語(yǔ)句一起使用這個(gè)標(biāo)簽來終止或繼續(xù)標(biāo)記語(yǔ)句的執(zhí)行。

標(biāo)簽語(yǔ)句作為引導(dǎo)關(guān)鍵詞在標(biāo)簽的同一行,后面跟著冒號(hào)“:”。 這里有一個(gè)用了該符號(hào)的while循環(huán)例子,所有的循環(huán)和switch都是相同的。

 

復(fù)制代碼代碼如下:

<label name>: while <condition> {
    <statements>
}

 

下面的例子里有一個(gè)用了標(biāo)簽的while循環(huán),使用了break和continue語(yǔ)句,Snakes and Ladders游戲可以在上文中看到:

為了勝利,你必須恰好到達(dá)25號(hào)方塊
如果骰子帶你超過了25號(hào)方塊,你必須重新丟骰子直到正好抵達(dá)25號(hào)方塊。

游戲板和上文中的一樣

Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解

變量 finalSquare, board, square, diceRoll的初始化都跟前文一樣:

 

復(fù)制代碼代碼如下:

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0

 

這個(gè)版本用while循環(huán)和switch語(yǔ)句來實(shí)現(xiàn)游戲邏輯。While循環(huán)的標(biāo)簽為gameLoop,為Snakes and Ladders Game標(biāo)記出游戲主體。

While循環(huán)的條件是while square != finalSquare,意思是你必須落在25號(hào)方塊上:

 

復(fù)制代碼代碼如下:

gameLoop: while square != finalSquare {
    if ++diceRoll == 7 { diceRoll = 1 }
    switch square + diceRoll {
    case finalSquare:
        // diceRoll will move us to the final square, so the game is over
        break gameLoop
    case let newSquare where newSquare > finalSquare:
        // diceRoll will move us beyond the final square, so roll again
        continue gameLoop
    default:
        // this is a valid move, so find out its effect
        square += diceRoll
        square += board[square]
    }
}
println("Game over!")

 

骰子在每個(gè)循環(huán)的最開始搖動(dòng)。然后玩家立即移動(dòng),switch語(yǔ)句用來判斷移動(dòng)的結(jié)果,算出是否允許移動(dòng):

如果骰子帶玩家抵達(dá)最后的方塊,游戲結(jié)束。break gameLoop語(yǔ)句將控制流帶到游戲結(jié)束的地方,即while循環(huán)外的第一行。
如果骰子超過了最后的方塊,則移動(dòng)無效,玩家需要再次投骰。break gameLoop會(huì)終止本次迭代,開始下次迭代。
在其他的情況下,骰子有效。玩家向前移動(dòng)方塊并根據(jù)游戲邏輯檢查蛇或梯子。循環(huán)結(jié)束,控制流返回到while條件判斷處,決定是否需要再次迭代。

NOTE 如果上面的break語(yǔ)句不使用gameLoop標(biāo)簽,將會(huì)中斷switch語(yǔ)句,而不是while語(yǔ)句。使用gameLoop標(biāo)簽可以更加明確的讓控制流終止。

同樣要注意,當(dāng)調(diào)用continue gameLoop來跳到下一個(gè)迭代循環(huán)中不是必須使用gameLoop標(biāo)簽。因?yàn)檫@里只有一個(gè)循環(huán)體,不會(huì)受到其他循環(huán)體的影響。然而,用了gameLoop標(biāo)簽也沒什么不好。這樣做保持與break旁邊的標(biāo)簽統(tǒng)一,有助于讓游戲邏輯能更加清晰閱讀和理解。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美无砖砖区免费| 少妇精69xxtheporn| 好吊色在线观看| 自拍偷拍色综合| jizz中国少妇| 台湾色综合娱乐中文网| 高清一区二区三区日本久| 91福利视频网| 成人午夜短视频| 国产成人精品一区二区三区在线观看| 国产福利一区二区在线精品| 久久这里只有精品8| 免费吸乳羞羞网站视频| 国产精品亚洲片夜色在线| 成人精品视频一区二区三区| 亚洲石原莉奈一区二区在线观看| 色先锋av男人资源先锋影院| 亚洲精品乱码久久| 天堂va欧美va亚洲va老司机| 国产日韩综合av| 亚洲经典中文字幕| 一区二区三区福利| 国产在线精品自拍| 久久久免费观看视频| 欧美贵妇videos办公室| brazzers欧美最新版视频| 91网站在线观看视频| 日韩网站在线观看| 日韩电影中文字幕在线观看| 秋霞影院一区| 老司机精品导航| 日韩精品欧美专区| 精品人妻在线视频| 东京热无码av男人的天堂| 国产免费不卡av| 欧美 日本 国产| 九九九九九伊人| 国产原创一区二区三区| 免费人成年激情视频在线观看| 久久九九全国免费精品观看| 首页亚洲欧美制服丝腿| 久久视频一区二区三区| 熟女人妻在线视频| 国产不卡一卡2卡三卡4卡5卡在线| jizzjizz视频| 亚洲一区二区三区免费在线观看| 欧美性生交大片免费| 91九色精品| 你懂的在线观看视频| 99久久婷婷国产综合| 尤物视频在线观看国产| 久久伊人中文字幕| 夜夜嗨av一区二区三区免费区| eeuss影影院www在线播放| 中文字幕在线综合| 国产黄色高清在线| 精品入口麻豆传煤| 亚洲天堂av一区| 亚洲啊v在线免费视频| 欧美精品一区二区三区免费播放| 亚洲成av人在线观看| 亚洲精品久久久久久国产精华液| 亚洲精品卡一卡二| 亚洲bt天天射| 日韩欧美激情一区| 欧美性xxxxxx| www.免费av| 五码日韩精品一区二区三区视频| 国产性xxxx| 日本黄色录像视频| 精品视频1区2区| 蜜臀99久久精品久久久久小说| 中文字幕无线精品亚洲乱码一区| 97se国产在线视频| 中文字幕一区二区三区人妻| 亚洲国产国产亚洲一二三| 久久久91精品国产一区二区精品| 欧美日本高清视频| 黄色小视频在线播放| 国产三级自拍| 久久久久久久久久久久久91| 五月激情婷婷网| 欧美日本高清视频| 福利成人导航| 人妻视频一区二区三区| 成人女性文胸| 色欲av无码一区二区人妻| 91 在线视频观看| 日本少妇激三级做爰在线| 少妇激情av一区二区三区| 综合激情丁香| 久久国产影院| 99精品视频免费全部在线| av网站免费播放| 亚洲国产一二三精品无码| 天天综合在线观看| www插插插无码视频网站| 国产高清精品在线| 日韩一区二区三区在线免费观看| 久久免费区一区二区三波多野| 精品美女一区二区| 精品视频在线观看一区二区| 欧美日韩中文字幕在线视频| 久久国产精品色| 黄色免费看网站| 久久久久久欧美精品se一二三四| ass白嫩白嫩的小美女| 欧洲美女女同性互添| 欧美一二三视频| 热久久一区二区| 欧美性性性性性ⅹxxbbbb| 欧美一级淫片007| www免费视频观看在线| 久久6免费视频| 高清电影一区| 日本免费专区| 最新日韩欧美| 日韩视频一区二区三区在线播放| 国产精品自拍三区| 在线播放视频一区| jizz中国免费| 色偷偷av男人的天堂| 亚洲精品视频网址| 写真福利片hd在线观看| 一级黄色在线视频| 性生生活大片免费看视频| 三级黄色片免费看| 91jq激情在线观看| 古典武侠综合av第一页| 国产精品久久久久久网站| 日本高清视频免费在线观看| 91精品国产麻豆国产自产在线| 夜色77av精品影院| h视频在线网站| 亚洲第一男人天堂| 久久久亚洲国产美女国产盗摄| 91av视频| 精品久久久久久中文字幕| 色偷偷成人一区二区三区91| 青春草视频在线| 国产美女情趣调教h一区二区| 97福利电影| 人人爱人人干婷婷丁香亚洲| 国产原创在线| 男人的天堂在线视频免费观看| 午夜视频久久久| а√天堂资源官网在线资源| 国产成人综合视频| 9久久婷婷国产综合精品性色| 中文字幕激情视频| 二区视频在线| 欧洲精品中文字幕| 国语对白中文字幕| 日韩二区三区| 91精品在线播放| 五码日韩精品一区二区三区视频| 粉嫩一区二区| 中文字幕亚洲第一| 中文字幕22页| 成人av资源站| 国产在线视频你懂的| 污视频在线观看免费网站| 超碰在线免费播放| 免费看日本黄色| 国产探花精品一区二区| 日韩欧美一二区| 日本黄色免费网址| 国产又粗又黄又爽的视频| 波多野结衣精品久久| 久久久久久久久精| www.青青草.com| 国产又粗又黄又猛| 日韩久久精品一区二区三区| 欧美一级做a| 国产一区视频网站| 天天插天天色| 国产精品毛片一区二区在线看舒淇| 免费成人美女女在线观看| 欧美一区二区在线观看| 日韩国产欧美视频| 国产农村妇女毛片精品久久| 久久精品无码一区二区三区毛片| 分分操这里只有精品| 成人3d精品动漫精品一二三| 欧美色图校园春色| 成a人片在线观看| 亚洲国产精品无码观看久久| 亚洲欧洲免费无码| 久久av秘一区二区三区| www.国产区| 欧美三级午夜理伦三级小说| 欧美人与物videos| 免费大片在线观看www| 欧美黄色一级生活片| 岛国av在线一区| 日韩经典av| 美腿丝袜在线亚洲一区| 亚洲成人第一页| www.91精品| 波多野结衣一区二区三区在线| 欧美一区激情视频在线观看| 亚洲国产欧美日韩另类综合| 精品素人av| 国产乡下妇女做爰毛片| 国产视频久久久久久| 久久视频这里有精品| 国产欧美一区二区在线播放| 国产亚洲精品v| 一区二区乱子伦在线播放| 欧美激情精品在线| 久章草在线视频| 欧美最猛性xxxxx亚洲精品| 在线播放国产精品二区一二区四区| 欧洲精品乱码久久久久蜜桃| 国产又爽又黄又刺激的软件| 伊人免费视频| 精品久久久久一区二区三区| 亚洲天堂网站在线| 日本久久精品视频| 中文字幕综合一区| 岛国在线视频免费看| 久久成年人免费电影| 国产精品18久久久久久久久| 91精品国产色综合久久不8| 一级黄色在线| 婷婷综合在线观看| 美女视频久久| 成人欧美色图| 日韩欧美色电影| aa亚洲一区一区三区| 手机av免费在线| 欧美精品一二三区| 中文字幕亚洲一区二区av在线| 国产老女人av| 日韩成人免费视频| 国产午夜精品一区二区三区欧美| 色妞在线综合亚洲欧美| 性欧美精品男男| 欧美日韩中文另类| 亚洲自拍偷拍区| 无码 人妻 在线 视频| 精品久久ai电影| 欧美大人香蕉在线| 久久免费看少妇高潮v片特黄| 91论坛在线播放| 欧美久久视频| 黄色片免费看| 2024短剧网剧在线观看| 一二三区精品福利视频| 成人免费观看男女羞羞视频| 亚洲一区二区中文在线| 亚洲欧美一区二区三区四区| 国产亚洲精品久久久优势| 国产在线视频99| 日本在线不卡视频| 91亚洲国产成人精品一区二三| 婷婷中文字幕一区| 免费av网站大全久久| 欧美尤物巨大精品爽| 亚洲男女一区二区三区| 天堂中文字幕——hd| 亚洲成人77777| 国产精品福利视频一区二区三区| 中国美女乱淫免费看视频| 国产精品久久久久久久久免费相片| av高清一区| 99久久er热在这里只有精品66| 精品国产欧美日韩一区二区三区| fc2人成共享视频在线观看| 中文字幕无码精品亚洲资源网久久| 老司机色在线视频| 亚洲欧美日韩在线观看a三区| 91久久综合| 97超碰人人爽| 欧美国产日韩在线观看成人| 国产精品最新在线观看| 精品电影一区| 日韩美女啊v在线免费观看| 91高清在线| 亚洲女爱视频在线| 中文字幕日韩av| 亚洲欧洲一区二区三区| 国产a√精品区二区三区四区| 亚欧洲精品视频| 疯狂试爱三2浴室激情视频| 玖玖爱在线精品视频| 精品美女久久| 久久精品日产第一区二区三区精品版| 久久精品影视大全| 国产精品视频一区二区三| 狠色狠色综合久久| 免费视频网站在线观看入口| 国产寡妇树林野战在线播放| 成人手机视频在线| 欧美成人xxxxx| 992tv在线观看| 日本r级电影在线观看| 老司机精品视频在线| 男人日女人视频网站| 青青草免费在线视频观看| 日产欧产美韩系列久久99| 国产日韩久久久| av中文一区二区三区| 日日天天久久| 免费三片在线播放| 日韩av大片在线观看| 国产精品视频在线观看免费| 少妇与大狼拘作爱性a| 2021av在线| 日本护士...精品国| 蜜桃av一区二区三区| 日本韩国精品一区二区在线观看| 欧美动漫一区二区| 99久久99久久精品免费看小说.| 精品国偷自产国产一区| 另类图片国产| 性网站在线免费观看| 91视频最新| 黄页在线观看视频| av免费在线电影| 日韩av一区二区三区美女毛片| 精品久久久久久无码人妻| 欧美三级自拍| 战狼4完整免费观看在线播放版| 美女在线视频一区二区| 成人影院在线观看| 自拍网站在线观看| 国模精品娜娜一二三区|