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

首頁 > 編程 > Swift > 正文

Swift教程之閉包詳解

2020-03-09 17:51:16
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift教程之閉包詳解,閉包可以在上下文的范圍內捕獲、存儲任何被定義的常量和變量引用,因這些常量和變量的封閉性,而命名為“閉包(Closures)”,需要的朋友可以參考下
 

閉包(Closures)是獨立的函數代碼塊,能在代碼中傳遞及使用。Swift中的閉包與C和Objective-C中的代碼塊及其它編程語言中的匿名函數相似。

閉包可以在上下文的范圍內捕獲、存儲任何被定義的常量和變量引用。因這些常量和變量的封閉性,而命名為“閉包(Closures)”。Swift能夠對所有你所能捕獲到的引用進行內存管理。

NOTE

假如你對“捕獲(capturing)”不熟悉,請不要擔心,具體可以參考Capturing Values(捕獲值)。

全局函數和嵌套函數已在 Functions(函數)中介紹過,實際上這些都是特殊的閉包函數
全局函數都是閉包,特點是有函數名但沒有捕獲任何值。
嵌套函數都是閉包,特點是有函數名,并且可以在它封閉的函數中捕獲值。
閉包表達式都是閉包,特點是沒有函數名,可以使用輕量的語法在它所圍繞的上下文中捕獲值。
Swift的閉包表達式有著干凈,清晰的風格,并常見情況下對于鼓勵簡短、整潔的語法做出優(yōu)化。這些優(yōu)化包括:
推理參數及返回值類型源自上下文
隱式返回源于單一表達式閉包
簡約參數名
尾隨閉包語法

1、閉包表達式

嵌套函數已經在Nested Functions(嵌套函數)中有所介紹,是種方便命名和定義自包含代碼塊的一種方式,然而,有時候在編寫簡短函數式的構造器時非常有用,它不需要完整的函數聲明及函數名,尤其是在你需要調用一個或多個參數的函數時。
閉包表達式是一種編寫內聯(lián)閉包的方式,它簡潔、緊湊。閉包表達式提供了數種語義優(yōu)化,為的是以最簡單的形式編程而不需要大量的聲明或意圖。以下以同一個sort函數進行幾次改進,每次函數都更加簡潔,以此說明閉包表達式的優(yōu)化。

Sort函數

Swift的標準函數庫提供了一個名為sort的函數,它通過基于輸出類型排序的閉包函數,給已知類型的數組數據的值排序。一旦完成排序工作,會返回一個同先前數組相同大小,相同數據類型,并且的新數組,并且這個數組的元素都在正確排好序的位置上。
The closure expression examples below use the sort function to sort an array of String values in reverse alphabetical order. Here's the initial array to be sorted:
以下的閉包表達式通過sort函數將String值按字母順序進行排序作說明,這是待排序的初始化數組。

 

復制代碼代碼如下:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

 

sort函數需要兩個參數:

一個已知值類型的數組
一個接收兩個參數的閉包函數,這兩個參數的數據類型都同于數組元素。并且
返回一個Bool表明是否第一個參數應排在第二個參數前或后。

這個例子是一組排序的字符串值,因此需要排序的封閉類型的函數(字符串,字符串)-> Bool。

構造排序閉包的一種方式是書寫一個符合其類型要求的普通函數:backwards,并將其返回值作為 sort 函數的第二個參數傳入:

 

復制代碼代碼如下:

func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = sort(names, backwards)
// reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

 

如果backwards函數參數 s1 大于 s2,則返回true值,表示在新的數組排序中 s1 應該出現(xiàn)在 s2 前。 字符中的 “大于” 表示 “按照字母順序后出現(xiàn)”。 這意味著字母 “B” 大于字母 “A”, 字符串 “Tom” 大于字符串 “Tim”。 其將進行字母逆序排序,”Barry” 將會排在 “Alex” 之后,以此類推。

但這是一個相當冗長的方式,本質上只是做了一個簡單的單表達式函數 :(a > b)。 下面的例子中,我們利用閉合表達式可以相比上面的例子更效率的構造一個內聯(lián)排序閉包。

閉包表達式語法

閉合表達式語法具有以下一般構造形式:

 

復制代碼代碼如下:
 
{ (parameters) -> return type in
statements
}

 

閉包表達式語法可以使用常量參數、變量參數和 inout 類型作為參數,但皆不可提供默認值。 如果你需要使用一個可變的參數,可將可變參數放在最后,元組類型也可以作為參數和返回值使用。

下面的例子展示了上面的 backwards 函數對應的閉包表達式構造函數代碼

 

復制代碼代碼如下:
 
reversed = sort(names, { (s1: String, s2: String) -> Bool in
return s1 > s2
})

需要注意的是聲明內聯(lián)閉包的參數和返回值類型與 backwards 函數類型聲明相同。 在這兩種方式中,都寫成了 (s1: String, s2: String) -> Bool類型。 然而在內聯(lián)閉包表達式中,函數和返回值類型都寫在大括號內,而不是大括號外。

 

閉包的函數體部分由關鍵字 in 引入。 該關鍵字表示閉包的參數和返回值類型定義已經完成,閉包函數體即將開始。

因為這個閉包的函數體非常簡約短所以完全可以將上面的backwards函數縮寫成一行連貫的代碼

 

復制代碼代碼如下:

reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )

 

可以看出 sort 函數的整體調用保持不變,還是一對圓括號包含兩個參數變成了內聯(lián)閉包形式、只不過第二個參數的值變成了。而其中一個參數現(xiàn)在變成了內聯(lián)閉包 (相比于 backwards 版本的代碼)。

根據上下文推斷類型

因為排序閉包是作為函數的參數進行傳入的,Swift可以推斷其參數和返回值的類型。 sort 期望第二個參數是類型為 (String, String) -> Bool 的函數,因此實際上 String, String 和 Bool 類型并不需要作為閉包表達式定義中的一部分。 因為所有的類型都可以被正確推斷,返回箭頭 (->) 和 圍繞在參數周圍的括號也可以被省略:

 

復制代碼代碼如下:
 
reversed = sort(names, { s1, s2 in return s1 > s2 } )

 

實際情況下,通過構造內聯(lián)閉包表達式的閉包作為函數的參數傳遞給函數時,都可以判斷出閉包的參數和返回值類型,這意味著您幾乎不需要利用完整格式構造任何內聯(lián)閉包。

同樣,如果你希望避免閱讀函數時可能存在的歧義, 你可以直接明確參數的類型。

這個排序函數例子,閉包的目的是很明確的,即排序被替換,而且對讀者來說可以安全的假設閉包可能會使用字符串值,因為它正協(xié)助一個字符串數組進行排序。

單行表達式閉包可以省略 return

單行表達式閉包可以通過隱藏 return 關鍵字來隱式返回單行表達式的結果,如上版本的例子可以改寫為:

 

復制代碼代碼如下:
 
reversed = sort(names, { s1, s2 in s1 > s2 } )

 

在這個例子中,sort 函數的第二個參數函數類型明確了閉包必須返回一個 Bool 類型值。 因為閉包函數體只包含了一個單一表達式 (s1 > s2),該表達式返回 Bool 類型值,因此這里沒有歧義,return關鍵字可以省略。

參數名簡寫

Swift 自動為內聯(lián)函數提供了參數名稱簡寫功能,可以直接通過 $0,$1,$2等名字來引用閉包的參數值。

如果在閉包表達式中使用參數名稱簡寫,可以在閉包參數列表中省略對其的定義,并且對應參數名稱簡寫的類型會通過函數類型進行推斷。 in 關鍵字也同樣可以被省略,因為此時閉包表達式完全由閉包函數體構成:

 

復制代碼代碼如下:
 
reversed = sort(names, { $0 > $1 } )

在這個例子中,$0 和 $1 表示閉包中第一個和第二個 String 類型的參數。

 

運算符函數
運算符函數實際上是一個更短的方式構造以上的表達式。

 

復制代碼代碼如下:
 
reversed = sort(names, >)

 

更多關于運算符表達式的內容請查看Operator Functions 。

2、Trailing 閉包

如果您需要將一個很長的閉包表達式作為最后一個參數傳遞給函數,可以使用 trailing 閉包來增強函數的可讀性。

Trailing 閉包是一個書寫在函數括號之外(之后)的閉包表達式,函數支持將其作為最后一個參數調用。

 

復制代碼代碼如下:

func someFunctionThatTakesAClosure(closure: () -> ()) {
// function body goes here
}
// here's how you call this function without using a trailing closure:
someFunctionThatTakesAClosure({
// closure's body goes here
})
// here's how you call this function with a trailing closure instead:
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}

 

注意

如果函數只需要閉包表達式一個參數,當您使用 trailing 閉包時,您甚至可以把 () 省略掉。

在上例中作為 sort 函數參數的字符串排序閉包可以改寫為:

 

復制代碼代碼如下:
 
reversed = sort(names) { $0 > $1 }

 

當閉包非常長以至于不能在一行中進行書寫時,Trailing 閉包就變得非常有用。 舉例來說,Swift 的 Array 類型有一個 map 方法,其獲取一個閉包表達式作為其唯一參數。數組中的每一個元素調用一次該閉包函數,并返回該元素所映射的值(也可以是不同類型的值)。 具體的映射方式和返回值類型由閉包來指定。

當提供給數組閉包函數后,map 方法將返回一個新的數組,數組中包含了與原數組一一對應的映射后的值。

下例介紹了如何在 map 方法中使用 trailing 閉包將 Int 類型數組 [16,58,510] 轉換為包含對應 String 類型的數組 ["OneSix", "FiveEight", "FiveOneZero"]:

 

復制代碼代碼如下:
 
let digitNames = [
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]

上面的代碼創(chuàng)建了整數數字到他們的英文名字之間映射字典。 同時定義了一個準備轉換為字符串的整型數組。

 

你現(xiàn)在可以通過傳遞一個 trailing 閉包給 numbers 的 map 方法來創(chuàng)建對應的字符串版本數組。需要注意的時調用 numbers.map不需要在 map 后面包含任何括號,因為只需要傳遞閉包表達式這一個參數,并且該閉包表達式參數通過 trailing 方式進行撰寫:

 

復制代碼代碼如下:

let strings = numbers.map {
(var number) -> String in
var output = ""
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
// strings is inferred to be of type String[]
// its value is ["OneSix", "FiveEight", "FiveOneZero"]

map 在數組中為每一個元素調用了閉包表達式。您不需要指定閉包的輸入參數 number 的類型,因為可以通過要映射的數組類型進行推斷。

 

閉包 number 參數被聲明為一個變量參數 (變量的具體描述請參看Constant and Variable Parameters),因此可以在閉包函數體內對其進行修改。閉包表達式制定了返回值類型為 String,以表明存儲映射值的新數組類型為 String。

閉包表達式在每次被調用的時候創(chuàng)建了一個字符串并返回。其使用求余運算符 (number % 10) 計算最后一位數字并利用digitNames 字典獲取所映射的字符串。

注意:

字典 digitNames 下標后跟著一個嘆號 (!),因為字典下標返回一個可選值 (optional value),表明即使該 key不存在也不會查找失敗。 在上例中,它保證了 number % 10 可以總是作為一個 digitNames 字典的有效下標 key。 因此嘆號可以用于強展開 (force-unwrap) 存儲在可選下標項中的 String 類型值。

從 digitNames 字典中獲取的字符串被添加到輸出的前部,逆序建立了一個字符串版本的數字。 (在表達式 number % 10中,如果number為16,則返回6,58返回8,510返回0)。

number 變量之后除以10。 因為其是整數,在計算過程中未除盡部分被忽略。 因此 16變成了1,58變成了5,510變成了51。

整個過程重復進行,直到 number /= 10 為0,這時閉包會將字符串輸出,而map函數則會將字符串添加到所映射的數組中。

上例中 trailing 閉包語法在函數后整潔封裝了具體的閉包功能,而不再需要將整個閉包包裹在 map 函數的括號內。

3、獲取值

閉包可以在其定義的范圍內捕捉(引用/得到)常量和變量,閉包可以引用和修改這些值,即使定義的常量和變量已經不復存在了依然可以修改和引用。牛逼吧、

在Swift中最簡單形式是一個嵌套函數,寫在另一個函數的方法里面。嵌套函數可以捕獲任何外部函數的參數,也可以捕獲任何常量和變量在外部函數的定義。

看下面這個例子,一個函數方法為makeIncrementor、這是一個嵌套函數,在這個函數體內嵌套了另一個函數方法:incrementor,在這個incrementor函數體內有兩個參數: runningTotal和amount,實際運作時傳進所需的兩個參數后,incrementor函數每次被調用時都會返回一個runningTotal值提供給外部的makeIncrementor使用:

復制代碼代碼如下:

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}

 

而函數makeincrementor的返回類型值我們可以通過函數名后面的()-> int得知返回的是一個Int類型的值。如需想學習了解更多地函數返回類型,可以參考: Function Types as Return Types.(超鏈接跳轉)

我們可以看見makeincrementor這個函數體內首先定義了一個整型變量:runningtotal,初始值為 0 ,而incrementor()函數最終運行的出來的返回值會賦值給這個整型變量。

makeincrementor函數()中向外部拋出了一個forIncrement參數供外部穿參進來、一旦有值進入函數體內會被函數實例化替代為amount,而amount會被傳遞進內嵌的incrementor函數體中與整型常量runningTotal相加得到一個新的runningTotal并返回。而我們這個主函數要返回的值是Int類型,runningTotal直接作為最終值被返回出去、makeincrementor函數()執(zhí)行完畢。

makeincrementor函數()在其內部又定義了一個新的函數體incrementor,作用就是將外部傳遞過來的值amount 傳進incrementor函數中與整形常量runningTotal相加得到一個新的runningTotal,

單獨的看incrementor函數、你會發(fā)現(xiàn)這個函數不尋常:

復制代碼代碼如下:

func incrementor() -> Int {
runningTotal += amount
return runningTotal
}

 

因為incrementor函數沒有任何的參數,但是在它的函數方法體內卻指向runningTotal和amount,顯而易見、這是incrementor函數獲取了外部函數的值amount,incrementor不能去修改它但是卻可以和體內的runningTotal相加得出新的runningTotal值返回出去。

不過,由于runningtotal每次被調用時都會相加改變一次實際值,相應地incrementor函數被調用時會去加載最新的runningtotal值,而不再是第一次初始化的0.并且需要保證每次runningTotal的值在makeIncrementor函數體內不會丟失直到函數完全加載完畢。要能確保在函數體內下一次引用時上一次的值依然還在。

注意
Swift中需要明確知道什么時候該引用什么時候該賦值,在incrementor函數中你不需要注解amount 和runningTotal。Swift還負責處理當函數不在需要runningTotal的時候,內存應該如何去管理。

這里有一個例子makeIncrementor函數:

 

復制代碼代碼如下:

let incrementByTen = makeIncrementor(forIncrement: 10)

 

4、引用類型閉包

在上面的例子中,incrementBySeven和incrementByTen是常量,但是這些常量在閉包的狀態(tài)下依然可以被修改。為何?很簡單,因為函數和閉包是引用類型。
當你指定一個函數或一個閉包常量/變量時、實際上是在設置該常量或變量是否為一個引用函數。在上面的例子中,它是閉合的選擇,incrementByTen指的是恒定的,而不是封閉件本身的內容。
這也意味著,如果你分配一個封閉兩種不同的常量或變量,這兩個常量或變量將引用同一個閉包:

 

復制代碼代碼如下:
 
let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
// returns a value of 50


注:相關教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
久久人人97超碰com| 李丽珍裸体午夜理伦片| 亚洲欧美日韩在线高清直播| 黄色片视频在线免费观看| 成人国产精品免费观看视频| 色就是色欧美色图| 日本а中文在线天堂| 午夜精品久久久久99蜜桃最新版| 色综合久久精品亚洲国产| 中文字幕人妻一区二区| 色婷婷精品大视频在线蜜桃视频| 欧美性色黄在线视频| 不卡在线视频| 99国产精品99| 99国产精品视频免费观看一公开| 亚洲国产高清av| 美女又爽又黄免费| 色偷偷久久一区二区三区| 日韩资源av在线| 69视频在线观看免费| 欧美成a人片在线观看久| 亚洲精品在线播放视频| 一级aaa毛片| 麻豆精品国产自产在线| 国产无套在线观看| 麻豆精品密在线观看| 丰满岳乱妇一区二区| 日本熟妇人妻xxxxx| 亚洲调教欧美在线| 亚洲乱码日产精品bd在线观看| 青青视频在线播放| 免费看a在线观看| 9999国产精品| av手机天堂网| 久久久久成人网| 性欧美最新另类| 免费国产一区二区| 国产无遮挡猛进猛出免费软件| xfplay精品久久| 国产91色在线播放| 亚洲欧美在线不卡| 福利电影一区| 蜜桃av导航| 亚洲精品一区中文字幕电影| 青青久在线视频免费观看| 美女福利一区二区| 日本欧美一区二区三区| 天天综合在线视频| 色琪琪免费视频网站| 国产精品久久久一区二区三区| 亚洲第一精品久久忘忧草社区| 在线视频一区二区三区四区| 一区二区三区国产福利| 中文字幕无码精品亚洲资源网久久| 久草在线资源站资源站| 精品偷拍各种wc美女嘘嘘| 欧美精品三级日韩久久| 性欧美videos另类hd| 国产精品婷婷| 欧洲精品久久| 久久这里只有精品免费| 欧美电影h版| 国产盗摄精品一区二区酒店| 国产日本欧洲亚洲| 久久免费国产| 欧美另类第一页| www.亚洲视频.com| 日本一区二区免费在线| 99精品视频一区二区三区| 黄色网免费看| 国产激情片在线观看| 日本精品一区二区三区高清| 亚洲免费一区三区| 欧洲毛片在线| 亚洲理论在线a中文字幕| 欧美精品videosex| 美女一区视频| 欧洲第一无人区观看| chinesemodel无套啪啪| 日韩欧美亚洲另类制服综合在线| 麻豆av资源| 中文字幕久热精品视频在线| 神马影院我不卡午夜| 极品粉嫩国产18尤物| 91理论片午午论夜理片久久| 一区二区三区精密机械公司| 国产真人无码作爱视频免费| 日韩亚洲国产精品| 日韩中文字幕麻豆| 欧美粗大gay| 亚洲综合第一区| 欧美三级午夜理伦三级中文幕| 国产二区精品| 浮力影院网站午夜| 国产亚洲欧洲黄色| av毛片精品| 精品蜜桃传媒| 免费人成黄页在线观看忧物| 午夜国产精品视频免费体验区| 99中文字幕一区| 男人的天堂亚洲| 日韩专区欧美专区| 国产视频一区二| 欧美日本高清视频在线观看| 亚洲sss综合天堂久久| tube国产麻豆| 午夜精品蜜臀一区二区三区免费| 在线观看成年人视频| 亚洲人成网站在线观看播放| 国a精品视频大全| 黄色的电影在线-骚虎影院-骚虎视频| 图片区亚洲欧美小说区| 尤物九九久久国产精品的特点| 国产日韩欧美精品| 国产一区二区免费在线| 成人免费淫片| 手机精品视频在线| 亚洲成人一区在线观看| 成年人网站在线观看视频| 日韩影院精彩在线| 国产黄色免费观看| 国模一区二区| 成人毛片老司机大片| 波多野结衣一区二区| 黄色亚洲在线| 亚洲自拍三区| 屁屁影院在线观看| 国产成人精品一区二区三区在线观看| 亚洲成人999| 成人午夜无人区一区二区| 欧美电影在线观看一区| 先锋影音二区| 看av免费毛片手机播放| 超薄肉色丝袜足j调教99| 精品国产乱码久久久久久久| 亚洲黄色性网站| 国产精品一区二区不卡视频| 日韩av手机在线观看| 制服丝袜中文字幕在线| 色综合www| 中文字幕在线视频免费| 91精品国产91久久综合桃花| 最新一本之道波多野结衣| 国产精品一区二区不卡| 中文字幕+乱码+中文字幕| 久久久中精品2020中文| 国精产品一品二品国精品69xx| 日本成人精品| 97天天综合网| 免费一级在线观看播放网址| 26uuu国产电影一区二区| 国产不卡视频在线| 欧美成欧美va| 日韩高清国产一区在线| 亚洲自拍偷拍网站| 狠狠色狠狠色合久久伊人| 人妻换人妻a片爽麻豆| 亚洲精品国产一区二区精华液| 日韩中文在线电影| 日韩美女在线| 国产高清在线精品一区二区三区| 国产在线播精品第三| 久久亚洲专区| 日本黄网站免费| 岛国片在线观看| 黄色漫画在线免费看| 在线观看欧美黄色| 欧美久久精品午夜青青大伊人| 久久久精品国产sm调教| 亚洲美女性囗交| 蜜臀91精品国产高清在线观看| 亚洲一区二区三区免费观看| 久久久久久精| 久久综合精品视频| 欧美影视一区在线| 2021中文字幕一区亚洲| 欧美一级爆毛片| 五月天丁香综合久久国产| 鲁啊鲁视频在线精品| 最近中文字幕免费视频| 国产亚洲欧美在线精品| www555久久| 亚洲第一精品夜夜躁人人躁| 熟女熟妇伦久久影院毛片一区二区| 国产午夜福利一区二区| 久久99热这里只有精品国产| av地址在线观看| 丰满岳乱妇一区二区| 免费观看一区二区三区| 国产精品美日韩| 国产无套精品一区二区| 精品久久久中文字幕人妻| 欧美夫妻性生活视频| 伊大人久久香线焦宗合一75大| 青草久久视频| 亚洲成a人片77777在线播放| 久草在线免费资源| 一本在线高清不卡dvd| 成人动漫一区二区| 一本一道dvd在线观看免费视频| 日韩和欧美的一区二区| 亚洲色图偷拍| 成人综合婷婷国产精品久久| 狠狠色丁香婷婷| 九九热这里有精品视频| 精品国产一区二区三区免费| 一本色道久久88综合日韩精品| 激情小说综合区| 97香蕉碰碰人妻国产欧美| 国产一区二区三区在线视频| 一区二区三区免费网站| 久久爱www成人| 91麻豆免费视频| 亚洲电影视频在线| 91视频在线免费| 欧美美女一区二区三区| 久久久久成人网站| 欧美日韩国产精品一区二区不卡中文| 成人影欧美片| 国产免费一区二区视频| 麻豆传媒mv| 免费亚色电影在线观看| 精品无人区一区二区| 欧美xxav| 一起操在线播放| 亚洲欧美在线视频免费| 久久久精品2019中文字幕之3| 性色av一区二区怡红| wwwww黄色| 免费国偷自产拍精品视频| 91人妻一区二区三区蜜臀| 在线免费看h| 丁香花五月婷婷| 免费看的黄色欧美网站| 亚洲视频专区在线| 亚洲美女炮图| 欧美xxxxxxxx| 中文成人激情娱乐网| 久久69国产一区二区蜜臀| 中文字幕av一区二区三区免费看| av网站在线免费看推荐| 色综合五月天导航| 亚洲综合色噜噜狠狠| 欧美亚洲国产一区二区三区va| 亚州欧美日韩中文视频| 黄色小视频在线播放| 日本人视频jizz页码69| 朝桐光av在线一区二区三区| jvid一区二区三区| 久久免费电影| 久久国产精品露脸对白| 一区二区三区麻豆| 一区二区在线免费| 天天插天天干天天操| 日本免费福利视频| 国产精品一区二区不卡视频| 精品一区二区免费看| 久久久久久久一区二区三区| 麻豆传媒在线完整视频| 91高潮精品免费porn| 91视频网页| 欧美精品久久天天躁| 丁香六月激情婷婷| 亚洲午夜久久久久久久久电影院| 国产在线国偷精品产拍免费yy| 久久爱www久久做| 亚洲色婷婷久久精品av蜜桃| 成人欧美精品一区二区| 日韩不卡高清视频| 久色国产在线| 日韩一区国产在线观看| 久久69精品久久久久久国产越南| 少妇搡bbbb搡bbb搡打电话| 久久久www| 亚洲理论在线a中文字幕| 欧美日韩综合另类| 久久精品视频网站| 水莓100在线视频| 女人偷人在线视频| 亚洲精品无码一区二区| 日韩av大片| 色婷婷777777仙踪林| 美女网站一区| 色www永久免费视频首页在线| 国产欧美日韩视频在线| 精品福利视频导航| 国产成人久久精品麻豆二区| 久久精品卡一| 欧美三级资源在线| 免费毛片在线播放| 少妇一区二区视频| 欧美一区二区三区播放老司机| 草色在线视频| 欧美精品一区二区三区中文字幕| 久久久精品毛片| 国产香蕉一区二区三区| 精品资源在线看| 亚洲欧美一区二区三区极速播放| 精品少妇久久久久久888优播| 18禁裸男晨勃露j毛免费观看| 四虎影院观看视频在线观看| 永久免费观看精品视频| 我要看黄色一级片| 97精品一区二区视频在线观看| 色8久久久久| 91视频婷婷| 久久一区二区精品| 日本黄网站色大片免费观看| 伦理片一区二区三区| 久久精品男人天堂| h在线观看网站| 国产激情视频一区二区在线观看| 在线观看欧美日韩| 国产精品天天干| 青青艹在线观看| 九九久久精品这里久久网| wwwxx在线观看| 四虎在线视频免费观看| 欧美高清中文字幕| 欧美亚洲一区二区三区| 欧美xxxx三人交性视频| 99热这里是精品| 色吊丝在线永久观看最新版本| 日本三级在线观看网站| 成人永久免费| 人妻无码中文字幕免费视频蜜桃| 日韩毛片在线| 中文字幕不卡在线播放|