精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

不學點高階函數,如何愉快的裝逼!

移動開發 Android
函數作為入參似乎無論在ObjC時代還是Swift時代都是司空見慣的事情,例如AFNetworking就用兩個入參block分別回調成功與失敗。我們可以將入參為函數的函數分為兩類,escaping函數入參和noescape函數入參,區別在于這個入參的函數是在執行過程內被調用還是在執行過程外被調用。

[[182412]] 

如果你開始接觸函數式編程,你一定聽說過高階函數。在維基百科它的中文解釋是這樣的:

在數學和計算機科學中,高階函數是至少滿足下列一個條件的函數:

  • 接受一個或多個函數作為輸入
  • 輸出一個函數

看起它就是ObjC語言中入參或者返回值為block的block或者函數,在Swift語言中即為入參或者返回值為函數的函數。那它們在實際的開發過程中究竟起著什么樣的作用呢?我們將從入參、返回值和綜合使用三部分來看這個問題:

函數作為入參

函數作為入參似乎無論在ObjC時代還是Swift時代都是司空見慣的事情,例如AFNetworking就用兩個入參block分別回調成功與失敗。Swift中更是加了一個尾閉包的語法(最后一個參數為函數,可以不寫括號或者寫到括號外面直接跟隨方法名),例如下面這樣:

  1. [1, 2, 3].forEach { item in 
  2.     print(item) 
  3.  

我們可以將入參為函數的函數分為兩類,escaping函數入參和noescape函數入參,區別在于這個入參的函數是在執行過程內被調用還是在執行過程外被調用。執行過程外被調用的一般用于callback用途,例如:

  1. Alamofire.request("https://httpbin.org/get").responseJSON { response in 
  2.     print(response.request)  // original URL request   
  3.     print(response.response) // HTTP URL response   
  4.     print(response.data)     // server data   
  5.     print(response.result)   // result of response serialization   
  6.  
  7.     if let JSON = response.result.value {        print("JSON: \(JSON)"
  8.     } 
  9.  

這個response的入參函數就作為網絡請求回來的一個callback,并不會在執行responseJSON這個函數的時候被調用。另外我們來觀察forEach的代碼,可以推斷入參的函數一定會在forEach執行過程中使用,執行完就沒有利用意義,這類就是noescape函數。

callback的用法大家應該比較熟悉了,介紹給大家noescape入參的一些用法:

1. 自由構造器

看過GoF設計模式的同學不知道是否還記得構造器模式,Android中的構造器模式類似如下:

  1. new AlertDialog.Builder(this) 
  2.   .setIcon(R.drawable.find_daycycle_icon) 
  3.   .setTitle("提醒"
  4.   .create() 
  5.   .show();  
  1. 構造一個對象需要很多的參數
  2. 這些參數里面很多有默認值
  3. 這些參數對應的屬性未來不希望被修改

那么用這樣的模式就可以直觀又精巧的展示構建過程。

如果使用noescape入參函數還可以更簡單的構造出這種代碼,只需要傳入一個入參為builder的對象就可以了,如下:

  1. // 實現在這里  class SomeBuilder {    var prop1: Int 
  2.     var prop2: Bool 
  3.     var prop3: String 
  4.     init() {        // default value   
  5.         prop1 = 0 
  6.         prop2 = true 
  7.         prop3 = "some string" 
  8.     } 
  9. }class SomeObj { 
  10.     private var prop1: Int 
  11.     private var prop2: Bool 
  12.     private var prop3: String 
  13.     init(_ builderBlock:(SomeBuilder) -> Void) {        let someBuilder = SomeBuilder() 
  14.         builderBlock(someBuilder) // noescape 入參的使用   
  15.         prop1 = someBuilder.prop1 
  16.         prop2 = someBuilder.prop2 
  17.         prop3 = someBuilder.prop3 
  18.     } 
  19. }// 使用的時候  let someOjb = SomeObj { builder in 
  20.     builder.prop1 = 15 
  21.     builder.prop2 = false 
  22.     builder.prop3 = "haha" 

2. 自動配對操作

很多時候,我們開發過程中都會遇到必須配對才能正常工作的API,例如打開文件和關閉文件、進入edit模式退出edit模式等。雖然swift語言給我們defer這樣的語法糖避免大家忘記配對操作,但是代碼看起來還是不那么順眼

  1. func updateTableView1() {    self.tableView.beginUpdates()    self.tableView.insertRows(at: [IndexPath(row: 2, section: 0)], with: .fade)    self.tableView.deleteRows(at: [IndexPath(row: 5, section: 0)], with: .fade)  self.tableView.endUpdates() // 容易漏掉或者上面出現異常  }func updateTableView2() {    self.tableView.beginUpdates() 
  2.     defer {        self.tableView.endUpdates() 
  3.     }    self.tableView.insertRows(at: [IndexPath(row: 2, section: 0)], with: .fade)    self.tableView.deleteRows(at: [IndexPath(row: 5, section: 0)], with: .fade) 

利用noescape入參,我們可以將要操作的過程封裝起來,使得上層看起來更規整

  1. // 擴展一下UITableView  extension UITableView {    func updateCells(updateBlock: (UITableView) -> Void) { 
  2.         beginUpdates() 
  3.         defer { 
  4.             endUpdates() 
  5.         } 
  6.         updateBlock(self) 
  7.     } 
  8. }func updateTableView() {  // 使用的時候   
  9.     self.tableView.updateCells { (tableView) in 
  10.         tableView.insertRows(at: [IndexPath(row: 2, section: 0)], with: .fade) 
  11.         tableView.deleteRows(at: [IndexPath(row: 5, section: 0)], with: .fade) 
  12.     } 

 

函數作為入參就簡單介紹到這里,下面看看函數作為返回值。

函數作為返回值

在大家的日常開發中,函數作為返回值的情況想必是少之又少。不過,如果能簡單利用起來,就會讓代碼一下子清爽很多。

首先沒有爭議的就是我們有很多的API都是需要函數作為入參的,無論是上一節提到過的escaping入參還是noescape入參。所以很多的時候,大家寫的代碼重復率會很高,例如:

  1. let array = [1, 3, 55, 47, 92, 77, 801]let array1 = array.filter { $0 > 3 * 3}let array2 = array.filter { $0 > 4 * 4}let array3 = array.filter { $0 > 2 * 2}let array4 = array.filter { $0 > 5 * 5} 

一段從數組中找到大于某個數平方的代碼,如果不封裝,看起來應該是這樣的。為了簡化,通常會封裝成如下的兩個樣子:

  1. func biggerThanPowWith(array: [Int], value: Int) -> [Int] { 
  2.     return array.filter { $0 > value * value} 
  3.  
  4. let array1 = biggerThanPowWith(array: array, value: 3) 
  5. let array2 = biggerThanPowWith(array: array, value: 4) 
  6. let array3 = biggerThanPowWith(array: array, value: 2) 
  7. let array4 = biggerThanPowWith(array: array, value: 5) 

 

如果用高階函數的返回值函數,可以做成這樣一個高階函數:

  1. // 一個返回(Int)->Bool的函數  func biggerThanPow2With(value: Int) -> (Int) -> Bool {    return { $0 > value * value } 
  2. }let array1 = array.filter(biggerThanPow2With(value: 3))let array2 = array.filter(biggerThanPow2With(value: 4))let array3 = array.filter(biggerThanPow2With(value: 2))let array4 = array.filter(biggerThanPow2With(value: 5)) 

 

你一定會說,兩者看起來沒啥區別。所以這里面需要講一下使用高階返回函數的幾點好處

1. 不需要wrapper函數也不需要打開原始類

如同上面的簡單封裝,其實就是一個wrapper函數,把array作為入參帶入進來。這樣寫代碼和看代碼的時候就稍微不爽一點,畢竟大家都喜歡OOP嘛。如果要OOP,那就勢必要對原始類進行擴展,一種方式是加extension,或者直接給類加一個新的方法。

2. 閱讀代碼的時候一目了然

使用簡單封裝的時候,看代碼的人并不知道內部使用了filter這個函數,必須要查看源碼才能知道。但是用高階函數的時候,一下子就知道了使用了系統庫的filter。

3. 更容易復用

這也是最關鍵的一點,更細粒度的高階函數,可以更方便的復用,例如我們知道Set也是有filter這個方法的,復用起來就這樣:

  1. let set = Set<Int>(arrayLiteral: 1, 3, 7, 9, 17, 55, 47, 92, 77, 801)let set1 = set.filter(biggerThanPow2With(value: 3))let set2 = set.filter(biggerThanPow2With(value: 9)) 

回憶下上面的簡單封裝,是不是就無法重用了呢?

類似的返回函數的高階函數還可以有很多例子,例如上面說過的builder,假如每次都需要定制成特殊的樣子,但是某個字段不同,就可以用高階函數很容易打造出來:

  1. func builerWithDifferentProp3(prop3: String) -> (SomeBuilder) -> Void {    return { builder in 
  2.         builder.prop1 = 15 
  3.         builder.prop2 = true 
  4.         builder.prop3 = prop3 
  5.     } 
  6. }let someObj1 = SomeObj.init(builerWithDifferentProp3(prop3: "a"))let someObj2 = SomeObj.init(builerWithDifferentProp3(prop3: "b"))let someObj3 = SomeObj.init(builerWithDifferentProp3(prop3: "c")) 

 

介紹完入參與返回值,還有另外的一個組合模式,那就是入參是一個函數,返回值也是一個函數的情況,我們來看看這種情況。

入參函數 && 返回值函數

這樣的一個函數看起來會很恐怖,swift會聲明成:

  1. func someFunc<A, B, C, D>(_ a: (A) -> B)-> (C) -> D 

objective-c會聲明成

  1. - (id (^)(id))someFunc:(id (^)(id))block 

讓我們先從一個小的例子來講起,回憶一下我們剛剛做的biggerThanPow2With這個函數,如果我們要一個notBiggerThanPow2With怎么辦呢?你知道我一定不會說再寫一個。所以我告訴你我會這樣寫:

  1. func not<T>(_ origin_func: @escaping (T) -> Bool) -> (T) -> Bool {    return { !origin_func($0) } 
  2. }let array5 = array.filter(not(biggerThanPow2With(value: 9))) 

 

并不需要一個notBiggerThanPow2With函數,我們只需要實現一個not就可以了。它的入參是一個(T) -> Bool,返回值也是(T) -> Bool,只需要在執行block內部的時候用個取反就可以了。這樣不單可以解決剛才的問題,還可以解決任何(T) -> Bool類型函數的取反問題,比如我們有一個odd(_: int)方法來過濾奇數,那我們就可以用even=not(odd)得到一個過濾偶數的函數了。

  1. func odd(_ value: Int) -> Bool {    return value % 2 == 1}let array6 = array.filter(odd)let array7 = array.filter(not(odd))let even = not(odd)let array8 = array.filter(even) 

大家可以看下上面的biggerThanPow2With時我們討論過的,如果biggerThanPow2With不是一個返回函數的高階函數,那它就不太容易用not函數來加工了。

綜上,如果一個入參和返回值都是函數的函數就是這樣的一個轉換函數,它能夠讓我們用更少的代碼組合出更多的函數。另外需要注意一下,如果返回的函數里面閉包了入參的函數,那么入參函數就是escaping入參了。

下面再展示給大家兩個函數,一個交換參數的函數exchangeParam,另一個是柯里化函數currying:

  1. func exchangeParam<A, B, C>(_ block: @escaping (A, B) -> C) -> (B, A) -> C {    return { block($1, $0) } 
  2. }func currying<A, B, C>(_ block: @escaping (A, B) -> C, _ value: A) -> (B) -> C {    return { block(value, $0) } 

 

swift語言里面>是一個入參(a, b)的函數,所以>(5, 3) == true。我們使用exchangeParam交換參數就變成了(b, a),這時exchangeParam(>)(5, 3)就等于false了。

而currying函數又把參數b固定為一個常量9,所以currying(exchangeParam(>), 9)就是大于9的函數意思。

這個例子里就利用了全部的預制函數和通用函數,沒有借助任何的命令與業務函數聲明實現了一個從數組中過濾大于9的子數組的需求。試想一下,如果我們更多的使用這樣的高階函數,代碼中是不是很多的邏輯可以更容易的互相組合,而這就是函數式編程的魅力。

總結

高階函數的引入,無論是從函數式編程還是從非函數式編程都帶給我們代碼一定程度的簡化,使得我們的API更加簡易可用,復用更充分。然而本文的例子不過是冰山一角,更多的內容還需要大家的不斷嘗試和創新,也可以通過學習更多的函數式編程范式來加深理解。

作者介紹:

 

責任編輯:龐桂玉 來源: 移動開發前線
相關推薦

2016-04-25 10:23:52

2015-07-28 17:58:22

程序員指南

2021-09-08 08:55:45

Javascript 高階函數前端

2020-02-01 15:49:07

Windows 7Windows 10Windows

2022-03-11 10:31:49

Go語音

2022-02-17 16:44:19

函數Go 語言高階函數

2023-11-29 10:06:52

2024-06-26 13:11:40

2024-07-18 15:08:27

2022-06-10 10:01:17

MacDockerLinux

2010-04-01 08:47:09

Oracle函數

2020-11-09 07:25:20

函數 JavaScript數據

2020-11-10 11:02:12

自定義Java代碼

2021-03-14 08:12:02

函數JavaScript語言

2023-05-06 07:27:47

2025-05-12 00:55:34

2020-09-16 12:10:19

九宮格視頻Python文件

2021-08-06 17:47:46

Kotin高階函數函數

2015-10-20 16:48:06

AnsibleDocker可擴展設計

2018-01-29 05:26:17

點贊
收藏

51CTO技術棧公眾號

国产美女精品视频| 色美美综合视频| 91麻豆精品秘密入口| 26uuu成人网| 99久久免费精品国产72精品九九| 亚洲一区精品在线| 久久综合精品一区| 美女黄页在线观看| 国产精品s色| 亚洲精品成人网| caoporn超碰97| 国产日产一区二区| 91色九色蝌蚪| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 永久免费看片视频教学| 国产一区二区三区| 亚洲视频在线观看三级| 九色一区二区| 一卡二卡在线视频| 一区二区国产精品| 日韩视频免费观看| 午夜一区二区三区免费| 图片一区二区| 日韩欧美在线中文字幕| 中文字幕超清在线免费观看| 天天影院图片亚洲| 国产美女一区二区| 国产精品com| 国产亚洲精品久久久久久无几年桃 | 久久精品亚洲天堂| 依依综合在线| 尤物视频一区二区| 欧美一区二区三区在线播放| 国产精品怡红院| 久久最新视频| 国内久久久精品| 国产67194| 久久福利综合| 国产偷亚洲偷欧美偷精品| 日本中文字幕在线不卡| 成人在线黄色| 黑人与娇小精品av专区| 青青青在线观看视频| 高清在线观看av| av中文字幕不卡| dy888夜精品国产专区| 亚洲图片中文字幕| 日韩精品视频网站| 91av在线播放视频| 国产乡下妇女做爰视频| 欧美a级片一区| 久久久www成人免费精品| 天堂久久精品忘忧草| 欧美午夜寂寞| 亚洲激情电影中文字幕| 亚洲视频天天射| 欧美一区一区| 欧美大片在线观看| av地址在线观看| 国产精品一区二区三区四区在线观看| 欧美三级中文字幕在线观看| 最近免费中文字幕中文高清百度| 在线播放高清视频www| 亚洲国产成人tv| 久久国产精品网| 成人福利电影| 婷婷六月综合亚洲| 青青视频在线播放| 国偷自产一区二区免费视频| 日韩欧美国产成人| 九色porny91| 欧美13videosex性极品| 一区二区三区免费观看| 黄色a级片免费看| 黄色在线免费观看网站| 亚洲成人av电影在线| 国产av第一区| 成全电影大全在线观看| 精品久久久久久久大神国产| 欧美成人xxxxx| 色综合一本到久久亚洲91| 在线观看亚洲一区| 在线观看免费av网址| 95精品视频| 欧美xingq一区二区| a级一a一级在线观看| 日韩美女国产精品| 亚洲色图18p| 正在播放国产对白害羞| 在线成人激情| 国语自产在线不卡| 六月丁香婷婷综合| 久久国产精品99久久久久久老狼| 成人在线免费观看视视频| 国产欧美熟妇另类久久久 | 91免费国产视频| 性做久久久久久久久久| 99re6这里只有精品视频在线观看| 精品日本一区二区三区| 精品成人一区二区三区免费视频| 欧美国产一区在线| 亚洲精品不卡| 精品精品导航| 欧美在线影院一区二区| 亚欧美一区二区三区| 欧美顶级毛片在线播放| 自拍偷拍亚洲区| 国产小视频在线看| 日韩av电影一区| 春色成人在线视频| eeuss影院在线播放| 一区二区三区精品在线观看| 美女av免费在线观看| 国产va免费精品观看精品| 欧美一级片免费看| 99久久人妻无码精品系列| 国产精品久久久久久麻豆一区软件| 久久久电影免费观看完整版| 黄色片网站在线免费观看| 国内精品国产三级国产a久久| 精品国产一区二区三区免费| 欧美激情视频在线播放| 欧美性xxxxx| 中文字幕无码毛片免费看| 欧美日韩伦理| 97超级碰在线看视频免费在线看| 一级特黄aaa| 久久综合久久鬼色中文字| 天天干天天色天天爽| 日韩成人影音| 日韩精品中文字幕视频在线| 日本一级二级视频| 免费久久99精品国产| 精品久久久久久综合日本| 国产三区视频在线观看| 欧美性大战久久久久久久蜜臀 | 亚洲最大免费| 日韩精品三区| 精品一区二区电影| 国产真实乱人偷精品视频| 精品一区二区三区免费视频| 热re99久久精品国99热蜜月| 精精国产xxxx视频在线野外| 日韩欧美一级二级| 日韩亚洲欧美中文字幕| 日韩在线一二三区| 免费av在线一区二区| 91美女主播在线视频| 欧美一区二区女人| 欧美性x x x| 久88久久88久久久| 欧美日本韩国一区二区三区| free性欧美| 欧美一区二区女人| a级黄色片免费看| 精品一区二区三区免费视频| 婷婷五月色综合| 麻豆国产在线| 精品香蕉一区二区三区| 国产成人无码一区二区三区在线| 夫妻av一区二区| 成年人看的毛片| 激情小说亚洲图片| 午夜精品一区二区三区在线播放| 成人精品在线播放| 亚洲高清免费一级二级三级| 日本五十肥熟交尾| 亚洲美女黄色| 六月婷婷久久| 丝袜美腿一区| 最近日韩中文字幕中文| 在线免费观看视频网站| 亚洲欧洲日韩在线| 深爱五月综合网| 国内精品久久久久久久影视麻豆| 国产精品一区二区免费| 蜜桃视频m3u8在线观看| 亚洲欧美日韩精品久久亚洲区| 手机在线看片1024| 国产精品三级视频| 欧洲美女亚洲激情| 好看的av在线不卡观看| 精品日本一区二区三区| 精品欧美一区二区三区在线观看 | 国产精品中文在线| 国产欧美久久久久久久久| 精品国产伦一区二区三区观看体验| 日本在线视频中文字幕| 国产亚洲人成网站| 伊人精品视频在线观看| 在线观看一区| 色狠狠久久av五月综合|| 亚洲一区二区三区久久久| 欧美激情在线一区| 精品三级久久久久久久电影聊斋| 欧美日韩国产在线播放网站| 91视频综合网| 91一区一区三区| 久久久久久久久久一区二区| 精品91视频| 久久人人97超碰人人澡爱香蕉| 成人涩涩视频| 国产69精品99久久久久久宅男| 色天堂在线视频| 欧美日产在线观看| 五月天丁香激情| 国产亚洲一二三区| youjizz.com日本| 免费在线成人网| 国产真人做爰毛片视频直播| 不卡在线一区二区| 国内成+人亚洲| 四虎影视国产精品| 热久久这里只有精品| 在线观看h网| 一区二区三区黄色| 手机在线观看毛片| 777xxx欧美| 精品久久久久久久久久久久久久久久久久| 亚洲男帅同性gay1069| 最近中文字幕在线mv视频在线 | 四虎精品成人免费网站| 51久久夜色精品国产麻豆| 婷婷激情五月网| 亚洲国产wwwccc36天堂| 免费在线观看黄色小视频| 久久亚洲一区二区三区四区| 精品人妻一区二区三| 日本91福利区| 日韩毛片在线免费看| 亚洲私人影院| 男女裸体影院高潮| 欧美肥老太太性生活| 日本不卡二区高清三区| 黄色欧美网站| 国产精品亚洲综合| 精品一区二区三区亚洲| 国产区精品视频| 电影天堂国产精品| 国产成人啪精品视频免费网| 悠悠资源网亚洲青| 538国产精品视频一区二区| 色爱综合区网| 中文字幕久热精品在线视频| 欧美挠脚心网站| 日韩成人在线视频观看| 免费看av毛片| 亚洲护士老师的毛茸茸最新章节| www.麻豆av| 日韩欧美成人激情| 国产a级免费视频| 欧美一区日韩一区| 99这里有精品视频| 91精品国产一区二区| 91中文字幕在线播放| 91精品久久久久久久91蜜桃| 国产又粗又猛又黄又爽| 欧美日韩成人一区| 一级特黄录像免费看| 欧美日韩国产大片| 一区二区三区日| 91国在线观看| 中文字幕在线播| 色激情天天射综合网| 日韩精品一区二区在线播放| 疯狂做受xxxx欧美肥白少妇| 人人干人人干人人干| 欧美日韩国产在线播放| 欧美a视频在线观看| 欧洲亚洲精品在线| 在线观看免费视频a| 欧美放荡的少妇| 精品久久久无码中文字幕| 精品国产麻豆免费人成网站| 神马一区二区三区| 亚洲日本欧美日韩高观看| 岛国最新视频免费在线观看| 精品国产一区二区三区久久久| 国产秀色在线www免费观看| 欧美成年人视频网站| 欧美极品少妇videossex| 韩国精品久久久999| 美女福利一区二区三区| 国产a∨精品一区二区三区不卡| se69色成人网wwwsex| 91嫩草国产在线观看| 亚洲黄页网站| 樱花www成人免费视频| 国产综合色产| 欧美日韩在线成人| 国产麻豆视频一区二区| chinese麻豆新拍video| 国产欧美中文在线| 欧美精品videos极品| 动漫精品一区二区| 91精品国产乱码久久久| 精品国内二区三区| av一区在线观看| 欧美激情欧美激情在线五月| 亚洲黄色网址| 亚洲自拍偷拍视频| 亚洲综合小说图片| 一本—道久久a久久精品蜜桃| 亚洲精品一级| 污污网站免费观看| 99国内精品久久| 三级影片在线观看| 日韩欧美中文在线| h狠狠躁死你h高h| 亚洲视频在线播放| 欧美aaa免费| 国产精品丝袜一区二区三区| 国产欧美啪啪| 成年人黄色在线观看| 久久国产成人| 99re6在线观看| 久久久久久免费| 妺妺窝人体色www聚色窝仙踪| 欧美日韩国产一区二区| 国产高清不卡视频| 丝袜美腿亚洲一区二区| 周于希免费高清在线观看 | 一卡二卡三卡视频| 开心九九激情九九欧美日韩精美视频电影 | 性欧美videos高清hd4k| 国产精品www| 日韩大片在线免费观看| www国产免费| 久久国产精品免费| 性欧美精品中出| 调教+趴+乳夹+国产+精品| www香蕉视频| 久久亚洲电影天堂| 国产精品黄色片| 日本精品一区二区| 亚洲欧美日韩视频二区| 天天躁日日躁狠狠躁av| 国产精品私人影院| 日韩av大片在线观看| 亚洲国产精品久久| 国产天堂在线播放视频| 91久久精品视频| 91综合久久一区二区| 久久午夜夜伦鲁鲁一区二区| 久久这里只有精品首页| 日韩特黄一级片| 亚洲成人免费网站| 精精国产xxxx视频在线中文版 | 在线视频你懂得| 国产一区二区久久精品| 亚洲黄色免费av| 欧美日韩高清在线一区| 另类亚洲自拍| 人妻视频一区二区| 在线精品视频一区二区三四| 国产二区在线播放| 国产精品一区二区三区毛片淫片| 精品理论电影| 成人午夜视频免费在线观看| 成人av在线电影| 在线观看精品国产| 精品一区二区三区三区| 日本精品不卡| 视频一区免费观看| 久久精品国产99| 天天做夜夜爱爱爱| 日韩久久精品一区| 2019中文字幕在线电影免费| 精品视频第一区| 日韩经典一区二区| 超碰人人干人人| 911国产精品| 91黄色在线| 国内一区二区三区在线视频| 久久婷婷丁香| 少妇aaaaa| 亚洲精品美女在线| 九七影院97影院理论片久久 | 精品视频导航| 蜜桃av一区二区在线观看| 欧美日韩精品在线观看视频 | 国产精品亚洲一区| 日本成人在线视频网站| avove在线播放| 亚洲欧美国产精品| 国产一区精品二区| 欧美在线观看成人| 亚洲天堂精品在线观看| 色欲av永久无码精品无码蜜桃| 国产精品久久久久999| 国产一区二区三区四区三区四| 久久av无码精品人妻系列试探| 欧美一级专区免费大片| 色豆豆成人网| 成年人视频网站免费| 国产精品嫩草影院com| 三级在线观看网站| 亚洲va码欧洲m码| 日本在线播放一区二区三区| 国产精品黄色网|