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

首頁 > 編程 > Swift > 正文

Swift的函數(shù)式編程詳解

2020-03-09 17:51:32
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Swift的函數(shù)式編程詳解,本文講解了Swift概覽、Swift遞歸、Swift 的高階函數(shù)和閉包等內(nèi)容,需要的朋友可以參考下
 

Swift 相比原先的 Objective-C 最重要的優(yōu)點之一,就是對函數(shù)式編程提供了更好的支持。 Swift 提供了更多的語法和一些新特性來增強函數(shù)式編程的能力,本文就在這方面進行一些討論。

Swift 概覽

對編程語言有了一些經(jīng)驗的程序員,尤其是那些對多種不同類型的編程語言都有經(jīng)驗的開發(fā)者, 在學習新的語言的時候更加得心應手。原因在于編程語言本身也是有各種范式的, 把握住這些特點就可以比較容易的上手了。

在入手一門新的語言的時候,一般關(guān)注的內(nèi)容有:

1.原生數(shù)據(jù)結(jié)構(gòu)
2.運算符
3.分支控制
4.如果是面向?qū)ο蟮木幊陶Z言,其面向?qū)ο蟮膶崿F(xiàn)是怎樣的
5.如果是函數(shù)式編程語言,其面向函數(shù)式編程的實現(xiàn)是怎樣的

通過這幾個點,其實只要閱讀 Swift 文檔的第一章,你就可以對這個語言有一個大概的印象。 比如對于數(shù)據(jù)結(jié)構(gòu),Swift 和其他的編程語言大體一樣,有 Int, Float, Array, Dictionary 等, 運算符也基本與 C 語言一致等。 本文主要集中于對 Swift 函數(shù)式編程方面的特點進行一些盤點,因此在這里假設(shè)大家對 Swift 的基本語法已經(jīng)有所了解。

對于一種編程范式,要掌握它也要抓住一些要點。對于支持函數(shù)式編程的語言,其一般的特點可能包含以下幾種:

1.支持遞歸
2.函數(shù)本身是語言 First Class 的組成要素,且支持高階函數(shù)和閉包
3.函數(shù)調(diào)用盡可能沒有副作用 (Side Effect) 的條件

接下來我們來逐個盤點這些內(nèi)容。

遞歸

Swift 是支持遞歸的,事實上現(xiàn)在不支持遞歸的編程語言已經(jīng)很難找到了。在 Swift 里寫一個遞歸調(diào)用和其他編程語言并沒有什么區(qū)別:

 

復制代碼代碼如下:

func fib(n: Int) -> Int {
  if n <= 1 {
    return 1
  }
  else {
    return fib(n-1) + fib(n-2)
  }
}
fib(6) // output 13

 

關(guān)于 Swift 的遞歸沒有什么好說的。作為一個常識,我們知道遞歸是需要消耗??臻g的。 在函數(shù)式編程語言中,遞歸是一個非常常用的方法,然而使用不慎很容易導致棧溢出的問題。 如果將代碼改寫為非遞歸實現(xiàn),又可能會導致代碼的可讀性變差,因此有一個技巧是使用“尾遞歸”, 然后讓編譯器來優(yōu)化代碼。

一個 Common Lisp 的尾遞歸的例子是

 

復制代碼代碼如下:

(defun fib(n)
    (fib-iter 1 0 n))
(defun fib-iter(a b count)
    (if (= count 0)
        b
        (fib-iter (+ a b) a (- count 1))))

 

我們可以把我們上述的 Swift 代碼也改寫成相同形式

 

復制代碼代碼如下:

func fibiter(a: Int, b: Int, count: Int) -> Int {
  if count==0 {
    return b
  }
  else {
    return fibiter(a + b, a, count-1)
  }
}
func fib(n: Int) -> Int {
  return fibiter(1, 1, n);
}

 

我們可以 Playground 里觀察是否使用尾遞歸時的迭代結(jié)果變化。

Swift的函數(shù)式編程詳解

值得注意的是,這里出現(xiàn)了一個 Swift 的問題。雖然 Swift 支持嵌套函數(shù),但是當我們將fibiter 作為一個高階函數(shù)包含在fib函數(shù)之內(nèi)的時候卻發(fā)生了 EXC_BAD_ACCESS 報錯, 并不清楚這是語言限制還是 Bug。

Swift 的高階函數(shù)和閉包

在 Objective-C 時代,使用 block 來實現(xiàn)高階函數(shù)或者閉包已經(jīng)是非常成熟的技術(shù)了。 Swift 相比 Objective-C 的提高在于為函數(shù)式編程添加了諸多語法上的方便。

首先是高階函數(shù)的支持,可以在函數(shù)內(nèi)定義函數(shù),下面就是一個很簡潔的例子。

 

復制代碼代碼如下:

func greetingGenerator(object:String) -> (greeting:String) -> String {
  func sayGreeting(greeting:String) -> String {
    return greeting + ", " + object
  }
  return sayGreeting
}
let sayToWorld = greetingGenerator("world")
sayToWorld(greeting: "Hello") // "Hello, World"
sayToWorld(greeting: " 你好 ") // " 你好, World"

 

如果使用 block 實現(xiàn)上述功能,可讀性就不會有這么好。而且 block 的語法本身也比較怪異, 之前沒少被人吐槽。Swift 從這個角度來看比較方便。事實上,在 Swift 里可以將函數(shù)當做對象賦值, 這和很多函數(shù)式編程語言是一樣的。

作為一盤大雜燴,Swift 的函數(shù)系統(tǒng)也很有 JavaScript 的影子在里面。比如可以向下面這樣定義函數(shù):

 

復制代碼代碼如下:

let add = {
  (a:Int, b:Int) -> Int in
  return a+b
}
add(1, 2) // 3

 

等號之后被賦予變量add的是一個閉包表達式,因此更準確的說, 這是將一個閉包賦值給常量了。注意在閉包表達式中,in關(guān)鍵字之前是閉包的形式定義,之后是具體代碼實現(xiàn)。 Swift 中的閉包跟匿名函數(shù)沒有什么區(qū)別。 如果你將它賦值給對象,就跟 JavaScript 中相同的實踐是一樣的了。幸好 Swift 作為 C 系列的語言, 其分支語句 if 等本身是有作用域的,因此不會出現(xiàn)下列 JavaScript 的坑:

 

復制代碼代碼如下:

if (someNum>0) {
  function a(){ alert("one") };
}
else {
  function a(){ alert("two") };
}
a() // will always alert "two" in most of browsers

 

Swift 的閉包表達式和函數(shù)都可以作為函數(shù)的參數(shù),從下面的代碼我們可以看出閉包和函數(shù)的一致性:

復制代碼代碼如下:

func function() {
  println("this is a function")
}
let closure = {
  () -> () in
  println("this is a closure")
}
func run(somethingCanRun:()-> ()) {
  somethingCanRun()
}
run(function)
run(closure)

 

類似于 Ruby,Swift 作為函數(shù)參數(shù)的閉包做了一點語法糖。 在 Ruby 中使用 Block 的時候,我們可以這樣寫:

 

復制代碼代碼如下:

(1...5).map {|x| x*2} // => [2, 4, 6, 8]

 

在 Swift 當中我們可以得到幾乎一樣的表達式。

 

復制代碼代碼如下:

var a = Array(1..5).map {x in x*2}
// a = [2, 4, 6, 8]

 

也就是說, 如果一個函數(shù)的最后一個參數(shù)是閉包,那么它在語法上可以放在函數(shù)調(diào)用的外面。 閉包還可以用$0、$1等分別來表示第 0、第 1 個參數(shù)等。 基本的運算符也可以看做函數(shù)。 下面的幾種方式都可以實現(xiàn)逆序倒排的功能。

 

復制代碼代碼如下:

let thingsToSort = Array(1..5)
var reversed1 = sort(thingsToSort) { a, b in a<b} var reversed2 =" sort(thingsToSort) { $0 < $1}" var reversed3 =" sort(thingsToSort, <) // operator as a function"  all the above are [5, 4, 3, 2, 1]<="" pre=""><p>總體來說,Swift 在添加方便函數(shù)操作、添加相關(guān)語法糖方面走的很遠,基本上整合了目前各種語言中比較方便的特性。 實用性較好。</p><p><strong>Side Effects</strong></p><p>在計算機科學中,函數(shù)副作用指當調(diào)用函數(shù)時,除了返回函數(shù)值之外,還對主調(diào)用函數(shù)產(chǎn)生附加的影響。例如修改全局變量 (函數(shù)外的變量) 或修改參數(shù) (<a href="http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29" target="_blank">wiki</a>)。 函數(shù)副作用會給程序帶來一些不必要的麻煩。</p><p>為了減少函數(shù)副作用,很多函數(shù)式編程語言都力求達到所謂的“純函數(shù)”。 純函數(shù)是指函數(shù)與外界交換數(shù)據(jù)的唯一渠道是參數(shù)和返回值, 而不會受到函數(shù)的外部變量的干擾。 乍看起來這似乎跟閉包的概念相抵觸,因為閉包本身的一個重要特點就是可以訪問到函數(shù)定義時的上下文環(huán)境。</p><p>事實上,為了在這種情況下支持純函數(shù),一些編程語言如 Clojure 等提供的數(shù)據(jù)結(jié)構(gòu)都是不可變 (或者說 Persist) 的。 因此其實也就沒有我們傳統(tǒng)意義上的所認為的“變量”的概念。比如說,在 Python 中,字符串str就是一類不可變的數(shù)據(jù)結(jié)構(gòu)。 你不能在原來的字符串上進行修改,每次想要進行類似的操作,其實都是生成了一個新的str對象。 然而 Python 中的鏈表結(jié)構(gòu)則是可變的。且看下面的代碼,在 Python 中對a字符串進行修改并不會影響b, 但是同樣的操作作用于鏈表就會產(chǎn)生不一樣的結(jié)果:</p><pre class="brush:js;toolbar:false">a = "hello, "
b = a
a += "world"
print a # hello, world
print b # hello,</pre><p>Swift 的數(shù)據(jù)結(jié)構(gòu)的 Persist 性質(zhì)跟 Python 有點類似。需要注意的是,Swift 有變量和常量兩種概念, 變量使用var聲明,常量使用let聲明,使用var聲明的時候,Swift 中的字符串的行為跟 Python 相似, 因此修改字符串可以被理解為生成了一個新的字符串并修改了指針。同樣, 使用var聲明的數(shù)組和字典也都是可變的。</p><p>在 Swift 中使用let聲明的對象不能被賦值,基本數(shù)據(jù)結(jié)果也會變得不可變,但是情況更復雜一點。</p><pre class="brush:js;toolbar:false">let aDict = ["k1":"v1"]
let anArray = [1, 2, 3, 4]
aDict["k1"] = "newVal" // !! will fail !!
anArray.append(5) // !! will fail !!
anArray[0] = 5 // anArray = [5, 2, 3, 4] now !</pre><p>從上面的代碼中可以看出,使用let聲明的字典是完全不可變的,但是數(shù)組雖然不可以改變長度, 卻可以改變數(shù)組元素的值!Swift 的文檔中指出這里其實是將 Array 理解為定長數(shù)組從而方便編譯優(yōu)化, 來獲得更好的訪問性能。</p><p>綜上所述,對象是否可變的關(guān)系其實略有復雜的,可以總結(jié)為:</p><ol class=" list-paddingleft-2"><li><p>使用var和let,Int和String類型都是不可變的,但是var時可以對變量重新賦值</p></li><li><p>使用let聲明的常量不可以被重新賦值</p></li><li><p>使用let聲明的Dictionary是完全不可變的</p></li><li><p>使用let聲明的Array長度不可變,但是可以修改元素的值</p></li><li><p>使用let聲明的類對象是可變的</p></li></ol><p>綜上所述,即使是使用let聲明的對象也有可能可變,因此在多線程情況下就無法達到“無副作用”的要求了。</p><p>此外 Swift 的函數(shù)雖然沒有指針,但是仍通過參數(shù)來修改變量的。只要在函數(shù)的參數(shù)定義中加入inout關(guān)鍵字即可。 這個特性很有 C 的風格。</p><p>個人覺得在支持通過元組來實現(xiàn)多返回值的情況下,這個特性不但顯得雞肋,也是一個導致程序產(chǎn)生“副作用”的特性。 Swift 支持這樣的特性,恐怕更多的是為了兼容 Objective-C 以及方便在兩個語言之間搭建 Bridge。</p><pre class="brush:js;toolbar:false">func inc(inout a:Int) {
  a += 1
}
var num = 1
inc(&num) // num = 2 now!</pre><p>綜上所述,使用 Swift 自帶的數(shù)據(jù)結(jié)構(gòu)并不能很好的實現(xiàn)“無副作用”的“純函數(shù)式”編程, 它并沒有比 Python、Ruby 這類語言走的更遠。幸好作為一種關(guān)注度很高的語言, 已經(jīng)有開發(fā)者為其實現(xiàn)了一套完全滿足不可變要求的數(shù)據(jù)結(jié)構(gòu)和庫:Swiftz。 堅持使用let和 Swiftz 提供的數(shù)據(jù)結(jié)構(gòu)來操作,就可以實現(xiàn)“純函數(shù)式”編程。</p><p><strong>總結(jié)</strong></p><p>在我看來,Swift 雖然實現(xiàn)了很多其他語言的亮點特性,但是總體實現(xiàn)來說并不是很整齊。 它在函數(shù)式編程方面添加了很多特性,但在控制副作用方面僅能達到平均水準。 有些特性看起來像是為了兼容原來的 Objective-C 才加入的。</p><p>Swift 寫起來相對比 Objective-C 更方便一點,脫離 Xcode 這樣的 IDE 來寫也是應該是可以的。 目前 Swift 只支持集中少量的原生數(shù)據(jù)結(jié)構(gòu)而沒有標準庫,更不具備跨平臺特性,這是一個缺點。 在仔細閱讀了文檔之后發(fā)現(xiàn) Swift 本身的語法細節(jié)還是很多的,就比如switch分置語句的用法就有很多內(nèi)容。 入門學習的容易程度并沒有原來想象的那么好。我個人并不覺得這門語言會對其他平臺的開發(fā)者有很大吸引力。</p><p>Swift 是一門很強大的語言,在其穩(wěn)定版本發(fā)布之后我認為我會從 Objective-C 轉(zhuǎn)向 Swift 來進行編程, 它在未來很可能成為 iOS 和 Mac 開發(fā)的首選。</p>
            </b}>
 


注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
免费又黄又爽又色的视频| 亚洲18在线| 精品久久中文字幕| 国产喷水在线观看| 亚洲少妇中文字幕| 欧美精品乱码视频一二专区| 亚洲美女性生活视频| 3d动漫一区二区三区| 亚洲人成网77777色在线播放| 欧美成人777| 欧美成人日韩| 香蕉视频999| 欧美日韩国产限制| www.国产麻豆| 日本高清不卡码| 丰满圆润老女人hd| 日本爱爱网站| 妖精视频一区二区三区| 无码无遮挡又大又爽又黄的视频| 色呦呦视频在线| 超碰在线94| 国产精品第七十二页| 亚洲欧美www| 欧美一区二区在线免费观看| www婷婷av久久久影片| 黄色免费看网站| 四虎永久网址| 国产一区二区在线视频观看| 国产综合色一区二区三区| 亚洲丰满在线| 国产成人免费看| 成人欧美一区二区三区在线湿哒哒| 亚洲日本japanese丝袜| 精品一区二区日本| 精品一区二三区| 亚洲第一图区| 91嫩草视频在线观看| av最新在线观看| 免费在线高清av| 色狠狠久久av五月综合|| 香蕉久久免费影视| 视频一区不卡| 国产人成精品一区二区三| 久久麻豆精品| 亚洲福利免费| 国产婷婷一区二区三区| 911国产精品| 一级片黄色免费| 国产不卡一二三| 伊人国产在线看一| 伊人中文字幕在线| 国产女片a归国片aa| 欧美在线观看不卡| 国产偷人爽久久久久久老妇app| 国产精品日本一区二区不卡视频| 人妻大战黑人白浆狂泄| 久久青草精品视频免费观看| 久久国产劲爆∧v内射| 国产激情第一页| 久久久久999| 亚洲人成7777| 天天av天天翘天天综合网色鬼国产| 日韩欧美视频一区| 国产91精品对白在线播放| 国产精品一区二区av交换| 99久热这里只有精品视频免费观看| 成人三级视频在线观看一区二区| 久久夜色精品国产欧美乱极品| 五月激情五月婷婷| 麻豆一区二区在线观看| 久久精品国产亚洲一区二区三区| 最新真实国产在线视频| 少妇高潮一69aⅹ| 国产一级视频在线| 麻豆精品视频入口| 人人妻人人澡人人爽精品日本| 久久综合之合合综合久久| 激情中国色综合| 中文字幕日韩欧美| 91蜜桃在线免费视频| 天天操天天干天天干| 精品无人区卡一卡二卡三乱码免费卡| 日韩专区在线观看| 国产日韩精品一区二区三区| bt7086福利一区国产| 亚洲欧洲精品一区二区三区波多野1战4| av免费在线一区二区三区| 视频一区视频二区中文字幕| www亚洲国产| 影音先锋成人资源网站| 日日摸天天爽天天爽视频| 不卡av在线免费观看| 国模大尺度一区二区三区| 国产精品欧美激情在线播放| 日韩av在线一区二区三区| 亚洲精品自产拍在线观看| 欧美一级二级三级| 国产免费内射又粗又爽密桃视频| 国产精品一区二区av日韩在线| 欧美99在线视频观看| 国产精品福利视频| 亚洲欧美日韩一区在线观看| 无套内谢的新婚少妇国语播放| 国产在线视频你懂的| 欧美大胆视频| 伊人久久综合视频| 偷拍亚洲色图| 国产网红在线| 国产成人精品亚洲日本在线观看| 人人干人人干人人| 亚洲av无码乱码国产精品fc2| 爱爱爱视频网站| 成人自拍在线| 91在线观看地址| 亚洲精品久久久| 艳母动漫在线观看| 久久人人爽人人爽人人片| 欧美日韩尤物久久| 欧洲xxxxx| 色一情一交一乱一区二区三区| 成人免费无遮挡无码黄漫视频| 又长又粗又大又爽| 免费男女羞羞的视频网站中文字幕妖精视频| 日本道免费精品一区二区三区| 在线观看国产成人av片| 五月天婷婷在线视频| 三级在线播放| 国产九九在线观看| 视频在线观看入口黄最新永久免费国产| 亚州国产精品久久久| 久久国产免费视频| 93久久精品日日躁夜夜躁欧美| 丝袜制服一区二区三区| 欧美亚洲国产视频| 在线视频观看亚洲| 免费在线观看污| 国产精品久久7| 国内视频精品| 高清不卡亚洲| 影院欧美亚洲| 成人字幕网zmw| 亚洲bt欧美bt精品777| 成人羞羞网站入口| 国产日韩欧美不卡在线| 日韩123区| 欧美国产一区二区在线观看| www免费视频观看在线| 在线观看xxxxvideo| 欧美成在线观看| 色婷婷综合久色| 午夜无码国产理论在线| 国内精品视频一区二区三区八戒| 欧美韩日精品| 欧美日韩三级在线观看| 美女把尿口扒开给男人桶视频| 日本成a人片在线观看| 亚洲天堂男人天堂女人天堂| 精品久久久久久久久久久久久久| 国产欧美一区二区三区在线看蜜臀| 黄网站app在线观看大全免费视频| 色姑娘综合网| 日韩一区二区在线观看视频| 五月天丁香视频| 日韩人妻无码一区二区三区99| 99re91这里只有精品| 日本久久久久久久久久久| 亚洲精品自在在线观看| 51久久精品夜色国产麻豆| 欧美男男gaytwinkfreevideos| caoporen国产精品| 国产网红主播福利一区二区| 8v天堂国产在线一区二区| 中文字幕第20页| 日韩亚洲在线| 午夜精品福利影院| 四虎永久免费地址| 里番全彩acg☆无翼乌全彩3d| 天天综合网站| 欧美bbbbbbbbbbbb精品| 国产精品久久二区二区| 欧美黄色一级视频| 日韩免费av片在线观看| 手机看片国产1024| 国产精品精华液网站| 粉嫩一区二区三区在线看| 亚洲第一区中文字幕| **日韩最新| 蜜桃网站在线观看| 欧美日韩国产色站一区二区三区| 国内自拍视频在线播放| 欧美在线观看天堂一区二区三区| 3d蒂法精品啪啪一区二区免费| 成人国产免费电影| 黄色片在线看| 久久6免费高清热精品| 亚洲成人综合视频| 久热国产在线视频| 一区二区三区不卡视频在线观看| 99精品国产一区二区三区不卡| 国产精品一久久香蕉国产线看观看| 亚洲黄色天堂| 欧美日韩国产免费观看视频| 亚洲国产精品综合小说图片区| 久久久人成影片一区二区三区| 亚欧无线一线二线三线区别| 91精品国产色综合久久不8| 亚洲视频免费观看| 日本女人性生活视频| 久久精品国产亚洲av无码娇色| 中文字幕网站视频在线| 992tv快乐视频| 你懂的网站在线观看| 国产乱妇乱子在线播视频播放网站| 在线观看欧美黄色| 无码人妻久久一区二区三区| 成人网6969conwww| 中文一区在线观看| 欧美欧美黄在线二区| 一区二区理论电影在线观看| 亚洲精品自产拍| 激情图片在线观看高清国产| 久久亚洲不卡| 中文在线视频| 97在线视频精品| 佐佐木明希电影| 亚洲欧洲av一区二区| 中国成人在线视频| 99riav在线| 国产精品午夜春色av| 欧美在线va视频| 国产福利一区二区三区在线视频| 蜜桃麻豆av在线| 国产系列精品av| а√中文在线资源库| 国产精品污污网站在线观看| 神马影院我不卡午夜| a级高清视频欧美日韩| 日韩手机在线导航| 影音先锋中文一区| 原创真实夫妻啪啪av| 日韩精品视频在线观看网址| av网站在线免费看| 欧美一区二区三区在线免费观看| 91精品一区国产高清在线gif| 亚洲av无码一区二区三区观看| 亚洲国产高清一区二区三区| 国产suv精品一区二区883| 麻豆专区一区二区三区四区五区| 人妻互换免费中文字幕| 欧洲成人性视频| 自拍偷拍欧美亚洲| 久久久亚洲精品无码| 亚洲成人免费| 中文字幕乱视频| 少妇视频在线观看| 91在线看黄| 黄色av免费在线播放| 亚洲激情 国产| 久久久免费精品视频| 色综合网色综合| 日韩1区2区日韩1区2区| 国产高清自拍视频| 久久久久狠狠高潮亚洲精品| 国内精品久久久久国产盗摄免费观看完整版| 女人裸体免费网站| 欧美丝袜第三区| 久久香蕉精品视频| 99精彩视频在线观看免费| 欧美成人国产精品高潮| 日韩黄色大片网站| 午夜成人鲁丝片午夜精品| 一区二区三区四区在线免费观看| 亚洲一区二区三区四区在线| 黄网视频在线观看| 91欧美激情一区二区三区成人| 91国偷自产一区二区使用方法| 亚洲欧洲日韩av| 欧美壮男野外gaytube| 久久这里有精品视频| 一级毛片国产| wwwxx在线观看| 免费黄色av网址| 国产精品18久久久久久麻辣| 国产精品456露脸| 日本熟妇毛茸茸丰满| 国产精品亚洲产品| 国产亚洲精品中文字幕| 亚洲一区二区三区四区中文| 国产精品日韩一区二区免费视频| 国产精品久免费的黄网站| 国产一区二区美女视频| 中文字幕免费高清网站| 五月天丁香视频| 亚洲国产日韩成人综合天堂| 伊人久久久久久久久| xxxx国产精品| 国产精品亚洲欧美一级在线| 小舞被吸乳羞羞网站视频| 国产精品av网站| 国产91足控脚交在线观看| 久久人人爽人人爽人人片av高清| 麻豆91在线播放免费| 久久久久99| 一区二区在线观看免费视频| 这里只有精品视频| 日本人成精品视频在线| 久久频这里精品99香蕉| 久久精品视频7| 亚洲国产一区二区三区四区| 国产69精品一区二区亚洲孕妇| 亚洲aⅴ天堂av在线电影软件| 亚洲福利在线看| 国产精品一区无码| 亚洲免费看片| 国产经典一区| 亚洲美女一区二区三区| 夜夜嗨av一区二区三区四季av| 午夜精品美女久久久久av福利| 亚洲v日韩v欧美v综合| 欧美日韩一区二区三区视视频| 成人短视频在线观看免费| 国产aⅴ综合色| 欧美激情综合在线| 欧美日本三区| 狠狠综合久久av一区二区| 日本夜爽爽一二区| 伊人一区二区三区久久精品| 美女精品视频在线|