国产精品青草久-国产精品情侣愉拍-国产精品区网红主-国产精品区一区二-国产精品热久久-国产精品热热热-国产精品人aⅴ-国产精品人成在线-国产精品人妻人伦-国产精品人人

金喜正规买球

logo Swift編程語言中文教程

文檔金喜正規(guī)買球>>Swift編程語言中文教程>>Swift編程語言中文教程(二十二):Swift泛型

Swift編程語言中文教程(二十二):Swift泛型


本頁包含內(nèi)容:

泛型代碼可以讓你寫出根據(jù)自我需求定義、適用于任何類型的,靈活且可重用的函數(shù)和類型。它的可以讓你避免重復的代碼,用一種清晰和抽象的方式來表達代碼的意圖。

泛型是 Swift 強大特征中的其中一個,許多 Swift 標準庫是通過泛型代碼構(gòu)建出來的。事實上,泛型的使用貫穿了整本語言手冊,只是你沒有發(fā)現(xiàn)而已。例如,Swift 的數(shù)組和字典類型都是泛型集。你可以創(chuàng)建一個Int數(shù)組,也可創(chuàng)建一個String數(shù)組,或者甚至于可以是任何其他 Swift 的類型數(shù)據(jù)數(shù)組。同樣的,你也可以創(chuàng)建存儲任何指定類型的字典(dictionary),而且這些類型可以是沒有限制的。

泛型所解決的問題

這里是一個標準的,非泛型函數(shù)swapTwoInts,用來交換兩個Int值:

func swapTwoInts(inout a: Int, inout b: Int)
  let temporaryA = a
  a = b
  b = temporaryA
}

這個函數(shù)使用寫入讀出(in-out)參數(shù)來交換a和b的值,請參考寫入讀出參數(shù)

swapTwoInts函數(shù)可以交換b的原始值到a,也可以交換a的原始值到b,你可以調(diào)用這個函數(shù)交換兩個Int變量值:

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
println("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// 輸出 "someInt is now 107, and anotherInt is now 3"

swapTwoInts函數(shù)是非常有用的,但是它只能交換Int值,如果你想要交換兩個String或者Double,就不得不寫更多的函數(shù),如 swapTwoStrings和swapTwoDoublesfunctions,如同如下所示:

func swapTwoStrings(inout a: String, inout b: String) {
    let temporaryA = a
    a = b
    b = temporaryA
}

func swapTwoDoubles(inout a: Double, inout b: Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}

你可能注意到 swapTwoInts、 swapTwoStrings和swapTwoDoubles函數(shù)功能都是相同的,唯一不同之處就在于傳入的變量類型不同,分別是Int、String和Double。

但實際應(yīng)用中通常需要一個用處更強大并且盡可能的考慮到更多的靈活性單個函數(shù),可以用來交換兩個任何類型值,很幸運的是,泛型代碼幫你解決了這種問題。(一個這種泛型函數(shù)后面已經(jīng)定義好了。)

注意:
 在所有三個函數(shù)中,a和b的類型是一樣的。如果a和b不是相同的類型,那它們倆就不能互換值。Swift 是類型安全的語言,所以它不允許一個String類型的變量和一個Double類型的變量互相交換值。如果一定要做,Swift 將報編譯錯誤。

泛型函數(shù)

泛型函數(shù)可以工作于任何類型,這里是一個上面swapTwoInts函數(shù)的泛型版本,用于交換兩個值:

func swapTwoValues<T>(inout a: T, inout b: T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

swapTwoValues函數(shù)主體和swapTwoInts函數(shù)是一樣的,它只在第一行稍微有那么一點點不同于swapTwoInts,如下所示:

func swapTwoInts(inout a: Int, inout b: Int)
func swapTwoValues<T>(inout a: T, inout b: T)

這個函數(shù)的泛型版本使用了占位類型名字(通常此情況下用字母T來表示)來代替實際類型名(如In、String或Doubl)。占位類型名沒有提示T必須是什么類型,但是它提示了a和b必須是同一類型T,而不管T表示什么類型。只有swapTwoValues函數(shù)在每次調(diào)用時所傳入的實際類型才能決定T所代表的類型。

另外一個不同之處在于這個泛型函數(shù)名后面跟著的展位類型名字(T)是用尖括號括起來的(<T>)。這個尖括號告訴 Swift 那個T是swapTwoValues函數(shù)所定義的一個類型。因為T是一個占位命名類型,Swift 不會去查找命名為T的實際類型。

swapTwoValues函數(shù)除了要求傳入的兩個任何類型值是同一類型外,也可以作為swapTwoInts函數(shù)被調(diào)用。每次swapTwoValues被調(diào)用,T所代表的類型值都會傳給函數(shù)。

在下面的兩個例子中,T分別代表Int和String:

var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt is now 107, and anotherInt is now 3
var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
// someString is now "world", and anotherString is now "hello"

注意
 上面定義的函數(shù)swapTwoValues是受swap函數(shù)啟發(fā)而實現(xiàn)的。swap函數(shù)存在于 Swift 標準庫,并可以在其它類中任意使用。如果你在自己代碼中需要類似swapTwoValues函數(shù)的功能,你可以使用已存在的交換函數(shù)swap函數(shù)。

類型參數(shù)

在上面的swapTwoValues例子中,占位類型T是一種類型參數(shù)的示例。類型參數(shù)指定并命名為一個占位類型,并且緊隨在函數(shù)名后面,使用一對尖括號括起來(如<T>)。

一旦一個類型參數(shù)被指定,那么其可以被使用來定義一個函數(shù)的參數(shù)類型(如swapTwoValues函數(shù)中的參數(shù)a和b),或作為一個函數(shù)返回類型,或用作函數(shù)主體中的注釋類型。在這種情況下,被類型參數(shù)所代表的占位類型不管函數(shù)任何時候被調(diào)用,都會被實際類型所替換(在上面swapTwoValues例子中,當函數(shù)第一次被調(diào)用時,T被Int替換,第二次調(diào)用時,被String替換。)。

你可支持多個類型參數(shù),命名在尖括號中,用逗號分開。

命名類型參數(shù)

在簡單的情況下,泛型函數(shù)或泛型類型需要指定一個占位類型(如上面的swapTwoValues泛型函數(shù),或一個存儲單一類型的泛型集,如數(shù)組),通常用一單個字母T來命名類型參數(shù)。不過,你可以使用任何有效的標識符來作為類型參數(shù)名。

如果你使用多個參數(shù)定義更復雜的泛型函數(shù)或泛型類型,那么使用更多的描述類型參數(shù)是非常有用的。例如,Swift 字典(Dictionary)類型有兩個類型參數(shù),一個是鍵,另外一個是值。如果你自己寫字典,你或許會定義這兩個類型參數(shù)為KeyType和ValueType,用來記住它們在你的泛型代碼中的作用。

注意
 請始終使用大寫字母開頭的駝峰式命名法(例如T和KeyType)來給類型參數(shù)命名,以表明它們是類型的占位符,而非類型值。

泛型類型

通常在泛型函數(shù)中,Swift 允許你定義你自己的泛型類型。這些自定義類、結(jié)構(gòu)體和枚舉作用于任何類型,如同Array和Dictionary的用法。

這部分向你展示如何寫一個泛型集類型--Stack(棧)。一個棧是一系列值域的集合,和Array(數(shù)組)類似,但其是一個比 Swift 的Array類型更多限制的集合。一個數(shù)組可以允許其里面任何位置的插入/刪除操作,而棧,只允許在集合的末端添加新的項(如同push一個新值進棧)。同樣的一個棧也只能從末端移除項(如同pop一個值出棧)。

注意
 棧的概念已被UINavigationController類使用來模擬試圖控制器的導航結(jié)構(gòu)。你通過調(diào)用UINavigationController的pushViewController:animated:方法來為導航棧添加(add)新的試圖控制器;而通過popViewControllerAnimated:的方法來從導航棧中移除(pop)某個試圖控制器。每當你需要一個嚴格的后進先出方式來管理集合,堆棧都是最實用的模型。

下圖展示了一個棧的壓棧(push)/出棧(pop)的行為:

Swift編程語言中文教程(二十二):Swift泛型

  1. 現(xiàn)在有三個值在棧中;
  2. 第四個值“pushed”到棧的頂部;
  3. 現(xiàn)在有四個值在棧中,最近的那個在頂部;
  4. 棧中最頂部的那個項被移除,或稱之為“popped”;
  5. 移除掉一個值后,現(xiàn)在棧又重新只有三個值。

這里展示了如何寫一個非泛型版本的棧,Int值型的棧:

struct IntStack {
    var items = Int[]()
    mutating func push(item: Int) {
        items.append(item)
    }
    mutating func pop() -> Int {
        return items.removeLast()
    }
}

這個結(jié)構(gòu)體在棧中使用一個Array性質(zhì)的items存儲值。Stack提供兩個方法:push和pop,從棧中壓進一個值和移除一個值。這些方法標記為可變的,因為它們需要修改(或轉(zhuǎn)換)結(jié)構(gòu)體的items數(shù)組。

上面所展現(xiàn)的IntStack類型只能用于Int值,不過,其對于定義一個泛型Stack類(可以處理任何類型值的棧)是非常有用的。

這里是一個相同代碼的泛型版本:

struct Stack<T> {
    var items = T[]()
    mutating func push(item: T) {
        items.append(item)
    }
    mutating func pop() -> T {
        return items.removeLast()
    }
}

注意到Stack的泛型版本基本上和非泛型版本相同,但是泛型版本的占位類型參數(shù)為T代替了實際Int類型。這種類型參數(shù)包含在一對尖括號里(<T>),緊隨在結(jié)構(gòu)體名字后面。

T定義了一個名為“某種類型T”的節(jié)點提供給后來用。這種將來類型可以在結(jié)構(gòu)體的定義里任何地方表示為“T”。在這種情況下,T在如下三個地方被用作節(jié)點:

  • 創(chuàng)建一個名為items的屬性,使用空的T類型值數(shù)組對其進行初始化;
  • 指定一個包含一個參數(shù)名為item的push方法,該參數(shù)必須是T類型;
  • 指定一個pop方法的返回值,該返回值將是一個T類型值。

當創(chuàng)建一個新單例并初始化時, 通過用一對緊隨在類型名后的尖括號里寫出實際指定棧用到類型,創(chuàng)建一個Stack實例,同創(chuàng)建Array和Dictionary一樣:

var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
// 現(xiàn)在棧已經(jīng)有4個string了

下圖將展示stackOfStrings如何push這四個值進棧的過程:

Swift編程語言中文教程(二十二):Swift泛型

從棧中pop并移除值"cuatro":

let fromTheTop = stackOfStrings.pop()
// fromTheTop is equal to "cuatro", and the stack now contains 3 strings

下圖展示了如何從棧中pop一個值的過程:
Swift編程語言中文教程(二十二):Swift泛型

由于Stack是泛型類型,所以在 Swift 中其可以用來創(chuàng)建任何有效類型的棧,這種方式如同Array和Dictionary。

類型約束

swapTwoValues函數(shù)和Stack類型可以作用于任何類型,不過,有的時候?qū)κ褂迷诜盒秃瘮?shù)和泛型類型上的類型強制約束為某種特定類型是非常有用的。類型約束指定了一個必須繼承自指定類的類型參數(shù),或者遵循一個特定的協(xié)議或協(xié)議構(gòu)成。

例如,Swift 的Dictionary類型對作用于其鍵的類型做了些限制。在字典的描述中,字典的鍵類型必須是可哈希,也就是說,必須有一種方法可以使其被唯一的表示。Dictionary之所以需要其鍵是可哈希是為了以便于其檢查其是否已經(jīng)包含某個特定鍵的值。如無此需求,Dictionary既不會告訴是否插入或者替換了某個特定鍵的值,也不能查找到已經(jīng)存儲在字典里面的給定鍵值。

這個需求強制加上一個類型約束作用于Dictionary的鍵上,當然其鍵類型必須遵循Hashable協(xié)議(Swift 標準庫中定義的一個特定協(xié)議)。所有的 Swift 基本類型(如String,Int, Double和 Bool)默認都是可哈希。

當你創(chuàng)建自定義泛型類型時,你可以定義你自己的類型約束,當然,這些約束要支持泛型編程的強力特征中的多數(shù)。抽象概念如可哈希具有的類型特征是根據(jù)它們概念特征來界定的,而不是它們的直接類型特征。

類型約束語法

你可以寫一個在一個類型參數(shù)名后面的類型約束,通過冒號分割,來作為類型參數(shù)鏈的一部分。這種作用于泛型函數(shù)的類型約束的基礎(chǔ)語法如下所示(和泛型類型的語法相同):

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // function body goes here
}

上面這個假定函數(shù)有兩個類型參數(shù)。第一個類型參數(shù)T,有一個需要T必須是SomeClass子類的類型約束;第二個類型參數(shù)U,有一個需要U必須遵循SomeProtocol協(xié)議的類型約束。

類型約束行為

這里有個名為findStringIndex的非泛型函數(shù),該函數(shù)功能是去查找包含一給定String值的數(shù)組。若查找到匹配的字符串,findStringIndex函數(shù)返回該字符串在數(shù)組中的索引值(Int),反之則返回nil:

func findStringIndex(array: String[], valueToFind: String) -> Int? {
    for (index, value) in enumerate(array) {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

findStringIndex函數(shù)可以作用于查找一字符串數(shù)組中的某個字符串:

let strings = ["cat", "dog", "llama", "parakeet", "terrapin"]
if let foundIndex = findStringIndex(strings, "llama") {
    println("The index of llama is \(foundIndex)")
}
// 輸出 "The index of llama is 2"

如果只是針對字符串而言查找在數(shù)組中的某個值的索引,用處不是很大,不過,你可以寫出相同功能的泛型函數(shù)findIndex,用某個類型T值替換掉提到的字符串。

這里展示如何寫一個你或許期望的findStringIndex的泛型版本findIndex。請注意這個函數(shù)仍然返回Int,是不是有點迷惑呢,而不是泛型類型?那是因為函數(shù)返回的是一個可選的索引數(shù),而不是從數(shù)組中得到的一個可選值。需要提醒的是,這個函數(shù)不會編譯,原因在例子后面會說明:

func findIndex<T>(array: T[], valueToFind: T) -> Int? {
    for (index, value) in enumerate(array) {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

上面所寫的函數(shù)不會編譯。這個問題的位置在等式的檢查上,“if value == valueToFind”。不是所有的 Swift 中的類型都可以用等式符(==)進行比較。例如,如果你創(chuàng)建一個你自己的類或結(jié)構(gòu)體來表示一個復雜的數(shù)據(jù)模型,那么 Swift 沒法猜到對于這個類或結(jié)構(gòu)體而言“等于”的意思。正因如此,這部分代碼不能可能保證工作于每個可能的類型T,當你試圖編譯這部分代碼時估計會出現(xiàn)相應(yīng)的錯誤。

不過,所有的這些并不會讓我們無從下手。Swift 標準庫中定義了一個Equatable協(xié)議,該協(xié)議要求任何遵循的類型實現(xiàn)等式符(==)和不等符(!=)對任何兩個該類型進行比較。所有的 Swift 標準類型自動支持Equatable協(xié)議。

任何Equatable類型都可以安全的使用在findIndex函數(shù)中,因為其保證支持等式操作。為了說明這個事實,當你定義一個函數(shù)時,你可以寫一個Equatable類型約束作為類型參數(shù)定義的一部分:

func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {
    for (index, value) in enumerate(array) {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

findIndex中這個單個類型參數(shù)寫做:T: Equatable,也就意味著“任何T類型都遵循Equatable協(xié)議”。

findIndex函數(shù)現(xiàn)在則可以成功的編譯過,并且作用于任何遵循Equatable的類型,如Double或String:

let doubleIndex = findIndex([3.14159, 0.1, 0.25], 9.3)
// doubleIndex is an optional Int with no value, because 9.3 is not in the array
let stringIndex = findIndex(["Mike", "Malcolm", "Andrea"], "Andrea")
// stringIndex is an optional Int containing a value of 2

關(guān)聯(lián)類型

當定義一個協(xié)議時,有的時候聲明一個或多個關(guān)聯(lián)類型作為協(xié)議定義的一部分是非常有用的。一個關(guān)聯(lián)類型給定作用于協(xié)議部分的類型一個節(jié)點名(或別名)。作用于關(guān)聯(lián)類型上實際類型是不需要指定的,直到該協(xié)議接受。關(guān)聯(lián)類型被指定為typealias關(guān)鍵字。

關(guān)聯(lián)類型行為

這里是一個Container協(xié)議的例子,定義了一個ItemType關(guān)聯(lián)類型:

protocol Container {
    typealias ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}

Container協(xié)議定義了三個任何容器必須支持的兼容要求:

  • 必須可能通過append方法添加一個新item到容器里;
  • 必須可能通過使用count屬性獲取容器里items的數(shù)量,并返回一個Int值;
  • 必須可能通過容器的Int索引值下標可以檢索到每一個item。

這個協(xié)議沒有指定容器里item是如何存儲的或何種類型是允許的。這個協(xié)議只指定三個任何遵循Container類型所必須支持的功能點。一個遵循的類型也可以提供其他額外的功能,只要滿足這三個條件。

任何遵循Container協(xié)議的類型必須指定存儲在其里面的值類型,必須保證只有正確類型的items可以加進容器里,必須明確可以通過其下標返回item類型。

為了定義這三個條件,Container協(xié)議需要一個方法指定容器里的元素將會保留,而不需要知道特定容器的類型。Container協(xié)議需要指定任何通過append方法添加到容器里的值和容器里元素是相同類型,并且通過容器下標返回的容器元素類型的值的類型是相同類型。

為了達到此目的,Container協(xié)議聲明了一個ItemType的關(guān)聯(lián)類型,寫作typealias ItemType。這個協(xié)議不會定義ItemType是什么的別名,這個信息留給了任何遵循協(xié)議的類型來提供。盡管如此,ItemType別名支持一種方法識別在一個容器里的items類型,以及定義一種使用在append方法和下標中的類型,以便保證任何期望的Container的行為是強制性的。

這里是一個早前IntStack類型的非泛型版本,適用于遵循Container協(xié)議:

struct IntStack: Container {
    // original IntStack implementation
    var items = Int[]()
    mutating func push(item: Int) {
        items.append(item)
    }
    mutating func pop() -> Int {
        return items.removeLast()
    }
    // conformance to the Container protocol
    typealias ItemType = Int
    mutating func append(item: Int) {
        self.push(item)
    }
    var count: Int {
    return items.count
    }
    subscript(i: Int) -> Int {
        return items[i]
    }
}

IntStack類型實現(xiàn)了Container協(xié)議的所有三個要求,在IntStack類型的每個包含部分的功能都滿足這些要求。

此外,IntStack指定了Container的實現(xiàn),適用的ItemType被用作Int類型。對于這個Container協(xié)議實現(xiàn)而言,定義 typealias ItemType = Int,將抽象的ItemType類型轉(zhuǎn)換為具體的Int類型。

感謝Swift類型參考,你不用在IntStack定義部分聲明一個具體的Int的ItemType。由于IntStack遵循Container協(xié)議的所有要求,只要通過簡單的查找append方法的item參數(shù)類型和下標返回的類型,Swift就可以推斷出合適的ItemType來使用。確實,如果上面的代碼中你刪除了 typealias ItemType = Int這一行,一切仍舊可以工作,因為它清楚的知道ItemType使用的是何種類型。

你也可以生成遵循Container協(xié)議的泛型Stack類型:

struct Stack<T>: Container {
    // original Stack<T> implementation
    var items = T[]()
    mutating func push(item: T) {
        items.append(item)
    }
    mutating func pop() -> T {
        return items.removeLast()
    }
    // conformance to the Container protocol
    mutating func append(item: T) {
        self.push(item)
    }
    var count: Int {
    return items.count
    }
    subscript(i: Int) -> T {
        return items[i]
    }
}

這個時候,占位類型參數(shù)T被用作append方法的item參數(shù)和下標的返回類型。Swift 因此可以推斷出被用作這個特定容器的ItemType的T的合適類型。

擴展一個存在的類型為一指定關(guān)聯(lián)類型

使用擴展來添加協(xié)議兼容性中有描述擴展一個存在的類型添加遵循一個協(xié)議。這個類型包含一個關(guān)聯(lián)類型的協(xié)議。

Swift的Array已經(jīng)提供append方法,一個count屬性和通過下標來查找一個自己的元素。這三個功能都達到Container協(xié)議的要求。也就意味著你可以擴展Array去遵循Container協(xié)議,只要通過簡單聲明Array適用于該協(xié)議而已。如何實踐這樣一個空擴展,在使用擴展來聲明協(xié)議的采納中有描述這樣一個實現(xiàn)一個空擴展的行為:

extension Array: Container {}

如同上面的泛型Stack類型一樣,Array的append方法和下標保證Swift可以推斷出ItemType所使用的適用的類型。定義了這個擴展后,你可以將任何Array當作Container來使用。

Where 語句

類型約束中描述的類型約束確保你定義關(guān)于類型參數(shù)的需求和一泛型函數(shù)或類型有關(guān)聯(lián)。

對于關(guān)聯(lián)類型的定義需求也是非常有用的。你可以通過這樣去定義where語句作為一個類型參數(shù)隊列的一部分。一個where語句使你能夠要求一個關(guān)聯(lián)類型遵循一個特定的協(xié)議,以及(或)那個特定的類型參數(shù)和關(guān)聯(lián)類型可以是相同的。你可寫一個where語句,通過緊隨放置where關(guān)鍵字在類型參數(shù)隊列后面,其后跟著一個或者多個針對關(guān)聯(lián)類型的約束,以及(或)一個或多個類型和關(guān)聯(lián)類型的等于關(guān)系。

下面的列子定義了一個名為allItemsMatch的泛型函數(shù),用來檢查是否兩個Container單例包含具有相同順序的相同元素。如果匹配到所有的元素,那么返回一個為true的Boolean值,反之,則相反。

這兩個容器可以被檢查出是否是相同類型的容器(雖然它們可以是),但它們確實擁有相同類型的元素。這個需求通過一個類型約束和where語句結(jié)合來表示:

func allItemsMatch<
    C1: Container, C2: Container
    where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
    (someContainer: C1, anotherContainer: C2) -> Bool {

        // check that both containers contain the same number of items
        if someContainer.count != anotherContainer.count {
            return false
        }

        // check each pair of items to see if they are equivalent
        for i in 0..someContainer.count {
            if someContainer[i] != anotherContainer[i] {
                return false
            }
        }

        // all items match, so return true
        return true

}

這個函數(shù)用了兩個參數(shù):someContainer和anotherContainer。someContainer參數(shù)是類型C1,anotherContainer參數(shù)是類型C2。C1和C2是容器的兩個占位類型參數(shù),決定了這個函數(shù)何時被調(diào)用。

這個函數(shù)的類型參數(shù)列緊隨在兩個類型參數(shù)需求的后面:

  • C1必須遵循Container協(xié)議 (寫作 C1: Container)。
  • C2必須遵循Container協(xié)議 (寫作 C2: Container)。
  • C1的ItemType同樣是C2的ItemType(寫作 C1.ItemType == C2.ItemType)。
  • C1的ItemType必須遵循Equatable協(xié)議 (寫作 C1.ItemType: Equatable)。

第三個和第四個要求被定義為一個where語句的一部分,寫在關(guān)鍵字where后面,作為函數(shù)類型參數(shù)鏈的一部分。

這些要求意思是:

someContainer是一個C1類型的容器。 anotherContainer是一個C2類型的容器。someContainer和anotherContainer包含相同的元素類型。 someContainer中的元素可以通過不等于操作(!=)來檢查它們是否彼此不同。

第三個和第四個要求結(jié)合起來的意思是anotherContainer中的元素也可以通過 != 操作來檢查,因為它們在someContainer中元素確實是相同的類型。

這些要求能夠使allItemsMatch函數(shù)比較兩個容器,即便它們是不同的容器類型。

allItemsMatch首先檢查兩個容器是否擁有同樣數(shù)目的items,如果它們的元素數(shù)目不同,沒有辦法進行匹配,函數(shù)就會false。

檢查完之后,函數(shù)通過for-in循環(huán)和半閉區(qū)間操作(..)來迭代someContainer中的所有元素。對于每個元素,函數(shù)檢查是否someContainer中的元素不等于對應(yīng)的anotherContainer中的元素,如果這兩個元素不等,則這兩個容器不匹配,返回false。

如果循環(huán)體結(jié)束后未發(fā)現(xiàn)沒有任何的不匹配,那表明兩個容器匹配,函數(shù)返回true。

這里演示了allItemsMatch函數(shù)運算的過程:

var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")

var arrayOfStrings = ["uno", "dos", "tres"]

if allItemsMatch(stackOfStrings, arrayOfStrings) {
    println("All items match.")
} else {
    println("Not all items match.")
}
// 輸出 "All items match."

上面的例子創(chuàng)建一個Stack單例來存儲String,然后壓了三個字符串進棧。這個例子也創(chuàng)建了一個Array單例,并初始化包含三個同棧里一樣的原始字符串。即便棧和數(shù)組否是不同的類型,但它們都遵循Container協(xié)議,而且它們都包含同樣的類型值。你因此可以調(diào)用allItemsMatch函數(shù),用這兩個容器作為它的參數(shù)。在上面的例子中,allItemsMatch函數(shù)正確的顯示了所有的這兩個容器的items匹配。

掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
国产精品成人一区二区三区 | 91精品欧美综合在线野草社区 | 97人妻人人揉人人躁人人 | www国产无套内射com | 国产91对白在线播放边 | 97热久久免费频精品99国产 | 久操综合在线 | 国产一级做a爰片久久毛片男 | 一区二区三区精密机械 | 亚洲国产av永久精品成人 | 一区二区三区日 | 91国内外精 | 日韩在线观看高清视频 | 91香蕉appios下载免费 | 性生大片免费观看性 | 欧美精品久久久久精品 | 亚洲va国产va欧美 | 国产美女被遭高潮免费 | 欧美日韩精品suv | 中文字幕人妻少妇伦伦伦 | 丰满尤物一区二区三区 | 亚洲无码小视频 | 97亚洲狠狠色综合久久 | 无人一码二码三码4码免费 无人影院手机版在线观看免费 | 日本www一道久久久免费 | 国产成人精品一区二三区在线观看 | 国产精品毛片va一区二区三区 | 国产一级国产一级在线观看 | 91九色精品 | 久草在.com| 国产a∨天天免费观看美女18 | 精品国产av无码久久久黄 | 日本一道在线播放高清 | 精品自拍高清 | 国产二区 | 亚洲中文字幕视频免费看 | 日韩av一区二区精品不卡 | 人人爽人人爽人人爽 | 91精品国产91久久久久久青草 | 亚洲av日韩av天堂一区二区三区 | 国产线路中文字幕 | 精品无码国产社区野花在线观 | 无码精品一区二区三区免费视频 | 国产精品无码无卡无需播放器 | 综合国产精品私拍国产在线 | 亚洲精品aa片在线观看国产 | 色婷婷久 | 精品少妇爆乳无码aⅴ区 | 日韩av无码一网二网三网 | 亚洲日韩高清在线亚洲专区2025 | 欧美色精品视频在线观看免费 | 伊人网视频 | 国产精品无码一区二区三区在 | 午夜性福利 | 依人网络在线综合视 | 国产成人欧美视频在线 | 日本限制 | 1区2区3区高清视频 1区2区3区内容究竟如何?无需下载 | 欧美人妻制服另类人妻在线 | 国产成人午夜福利r在线观看观看 | 国内精品久久久久久蜜芽 | 亚洲a∨毛片无码专区国产乱码 | 国产成人精品国产成人亚洲 | 日本打屁股sm调教 | 免费一级片观看 | 日韩午夜影院在线观看 | 亚洲av无码专区国产不卡顿 | 国产色播色 | 亚洲一区免费观看 | 精品国精品国产自在久91 | 国产成人精品午夜福利在线观看 | 色婷婷我要去我去也 | 亚洲产国偷v产偷v自拍色戒 | 成年女人免费碰碰视频 | 国产成人精品免费视频大全 | 国内精品伊 | ts人妖国产在线观看 | 在线播放无码后入内射少妇 | 丰满人妻熟妇乱又伦精品视 | 精品国产乱码久久久久久毛片 | 亚洲欧美另类自拍第一页 | 中文字幕人妻一区二区在线视频 | 欧美va久久久噜噜噜久久 | 亚洲a∨毛片无码专区国产乱码 | 国产无线卡一卡二 | 日韩在线视频一区二区三区 | 亚洲va中文在线播放免费 | 精品无码av一区二区三区 | 92久久| 日韩精品无码免费专区午夜 | 日本爽快片18禁片免费久久 | 91精品国产综合久久久久久久 | 亚洲国产欧美日韩v一区二区 | 日本高清一区二区三区 | 国产人妖视频一区二区 | 在线观看免费午夜大片 | 国偷自拍视频在线观看 | 国产妇女性爽视频免费 | 亚洲精品午夜 | 亚洲精品青青草原avav久久qv | 日韩高清无码免费精品 | 91人妻人人澡人人爽人人爽 | 日本xxxx裸体xxxx免费 | 日本婷婷天堂吧 | 三年级在线观看免费观看大全 | 欧日韩在线不卡视 | 99久免费精品视频在线观78 | 精品国产一区二区av果冻传媒 | 91午夜精品福利视频 | 国产精品一区中文字幕 | 97人妻人人做人碰人人爽 | 国产精品人伦一区二区三 | 亚洲国产综合一区 | 国产91精品一区二区 | 国产精品99精品无码视亚 | 国产成人h在线视频 | 午夜三级影院动漫在线观看 | 国产一级片在线 | 欧美牲交a欧美牲交 | 亚洲男人的天堂一区二区无码 | 国产欧美一区二区樱花在线观看 | 无码不卡在线观看网站 | 国产性夜夜春夜夜爽18 | 午夜成人亚洲理伦片在线观看 | 国产成人午夜福利在线播放 | 91精品人妻一区二区三区浪潮 | 97色涩 | 国产高潮流白浆喷水在线观看 | 国产成人综合亚洲亚洲欧美 | 国产在线拍揄自揄拍无码视频 | 亚洲日韩一区二区三区四区高清 | 人妻日韩欧美综合制服 | 精品熟女少妇av免费看 | 国产国语一级毛片全部电影 | 国产日本在线播放 | 欧美人与动牲交 | 亚洲精品白浆高清久久久久久 | 91短视频官网 | 无码人妻精品一区二 | 91尤物国产尤物福利 | 国产欧美一区二区三区久久 | 丰满少妇又爽又紧又丰满在线观 | 国产区女主播在线观看 | 日韩av午夜无码专区 | 天堂网无码av手机版 | 亚洲尺码一区二区三区 | 久久国产avjust麻豆 | 国产乱子伦在线观看视频 | 国产一区福利姬在线观看 | 国产免费久久精品99久久 | 国产精品手机网站 | 亚洲成a人片在线观看中文 亚洲成a人片在线观看中文无码 | 99精品国产九九国产精品 | 另类欧美日韩综合一区 | 少妇无码一区二区三区免费 | 亚洲女同成av人片在线观看 | 不卡中文av在线 | 亚洲三级片在线观看 | av午夜午夜快憣免费观看 | 三级aⅴ在线观看 | 自拍另类 | 国产亚洲福利在线视频 | 三级久久三级久久三级 | 久久高潮| 成人午夜福利电影 | 国产av综合第一页 | 色视频www在线播放国产人成 | 精品一区二区三区在线观看视频 | 色婷婷国产精品欧美毛片 | 亚洲日本乱人伦中文字幕 | 精品视频一区二区三区在线观看 | 丰满爆乳肉感一区二区三区 | 亚洲欧美成人久久一区 | 久久99爰这里有精品国产 | 99热国产这里只有精品 | 国产毛片精品视频网站 | 精品乱码一区二区三区四区 | 中文字幕亚洲欧美另类 | 国产精品午夜爆乳美女视频 | 无套内射在线无码播放 | 日本熟妇色 | 亚洲国产精品看片在线观看 | 少妇免费三级在线观看 | 麻豆国产在线观 | 在线天堂官网 | 毛茸茸性xxxx毛茸茸毛茸茸 | 国产精品自在线拍国产第一页 | 成人毛片18女人毛片免费看视频 | 国产精品热九九无码aⅴ | 成人夜晚看片如何选择合适的影片 | 波多野结衣的av一区二区三区 | 国产高清乱码一区二区三区 | 日韩精品无码一区二区三区三州 | 99久久婷婷国产综合精品青草免费 | 国产白丝 | 国产精品巨作无遮拦 | 91在线精品秘一区二区 | 亚洲成av人影院在线观看网 | 无码国模国产在线无码精品 | 国产成人一区二区三区在线观看 | 欧美在线观看一区 | 午夜免费理论片在线看 | 亚洲av无码一区东京热不卡 | 亚洲成av人片乱码色午夜 | 少妇私密会所按摩到高潮呻吟 | 在线精品无码不不卡 | 3p国产对白刺激在线视频 | 在线好吊色视频 | 91av视频在线| 精品无码国产av一区二区 | 怡红院成永久免费人全部视频 | 91久久香蕉国产熟女线看 | 国产精品露脸国语对白 | 国产91高潮流白浆在线播放un | 超碰香蕉亚洲香蕉亚洲 | 国产精品视频一区二区三区不卡 | 91精品国产福利在线观看麻豆 | 精品一区二区在线视 | 精品一二区 | 国产乱码久久久网站 | 91精品视频在线 | 亚洲精品无码专区国产乱码 | 午夜福利一区二区三区高清视频 | 国产精品高清一区二区三区久久你 | 99久久国产综合精品swag | 亚洲中文字幕网资源站 | 午夜影院一区二区三区 | 特级毛片a级毛片免费观看网站 | 成人自拍视频免费在线观看 | 亚洲成熟丰满熟妇高潮xxxxx | 日韩精品搭讪在线视频播放 | 国产成人亚洲综合无码ⅴ | 在线观看无码视频 | 国产精品爽爽va在 | 91精品久久人人妻人人做 | 特级无码a级毛片特黄 | 国产女主播喷水视频在线观看 | 无码在线一区二区在线观看网站 | 亚洲乱码国产乱码精品精 | 国产日韩欧美综合 | 91视频免费版安卓版下载v1.0 | 91无码人妻精品一区二区三区 | 国产萌白酱在线一区二区 | 国产真人无码免费视频 | 亚洲国产精品无码av | 亚洲av综合色区无码一二三 | 极品尤物国产在线播放 | 国产精品初高中精品免费观看 | 日本熟妇色 | av岛国小电影在线观看 | 国产亚洲精品合集久久久久 | 成人免费777777 | 欧美日韩免费中文 | 精品中文字幕一区二区三区四区 | 成年人午夜激情视频在线观看 | 国产v亚洲v欧 | 国产精品乱码高清在线观看 | 国产v在线在线观看视频免费 | 亚洲a∨天堂无码麻豆电影 亚洲a∨无码成人精品区在线观看 | 午夜人成在线观看深夜两性视频试看 | 国产精品色婷婷亚洲综合看片 | 欧美一区二区三区精品国产 | 精品无人区一区二区三区在线 | 婷婷色爱区综合 | 成人嘿嘿视频网站在线 | 蜜月国产日韩久久久久精品 | 国产无线卡一卡二 | 果冻传媒在线观看九一制片厂 | 亚洲欧美国产另类va在线观看 | 91果冻传媒app | 亚洲av无码资源在 | 高潮毛片无遮挡高清免费视频 | 日韩十八禁在线1区2区3区不卡 | 国产精品一区 | 亚洲视频一区 | 国产精品一区久久 | 97人人模人 | 欧美日本日韩aⅴ在线视频 欧美日本三级 | 成人精品动漫一区二区三区 | 亚洲日韩精品一区二区三区 | 欧美老熟妇乱大交xxxxx | 少妇a级毛片人成网 | 黄色毛片看看 | 成全动漫高清电影好看的电视剧 | 免费一区二区福利视频在线 | 亚洲精品国产第一 | 亚洲精品中文字幕久久久久 | av中文字幕潮喷在线 | 91麻豆精品国产91久 | 一级日本高清视频免费观看 | 惠民福利精品女同一区二区在线观看 | 国产高清超清在线播放 | 三级国产精品亚洲 | 天天躁狠狠躁狠狠躁夜夜躁 | 午夜理理伦a级毛片天天看 午夜理理伦电影a片无码 | 一区二区三区精品aⅴ专区 一区二区三区精品黄色影院 | 欧美日韩免费播放一区二区 | 精品国产成人a区在线观看 精品国产成人t | 成年久久久久 | 国产成a人片在线观看视 | 丰满人妻一区二区三区53视频 | 中文字幕乱码亚洲∧v日本1 | 午夜成人电影app | 狠狠色综合激情丁香色九月 | 国产日韩欧美另类视频 | 亚洲精品自偷自拍无码忘忧 | 亚洲av永久天堂在线观看 | 一区二区视频在线观看高清视频在线 | 成人午夜电影免费完整在线看 | 色噜噜狠狠狠狠色综合久一 | 国产精品va无码一区二区三区 | 国产av综合影院 | 亚洲国产综合自在线婷婷 | 国产福利免费 | 国产成人无码区在线观看資源免費看 | 无人在线观看免费高清 | 国产一级a在线观看免费蜜桃视频 | 亚洲日本中文字幕在线四区 | av天堂最新手机网址 | 91在线无码精品入口九色 | 日韩一区二区三区精品 | 成年福利片在线观看 | 日本一区二区三区免费播放视频站 | 国产精品视频专区 | 天码av无码一区二区三区四区 | 亚洲精品午夜久久久伊人 | 91国偷自产一区二区三区 | 精品国产一区二区三区无码 | 国产日韩精品欧美一区喷水 | 国内揄拍国内精品少妇 | 国产无夜精华 | 日本h纯肉无遮掩3d动漫在线观 | 国产三级视频在线观看 | 91高清视频 | 国产成人久久一区二区三区 | 国产一级淫片视频免费看 | 日韩欧美~中文字幕无敌色 日韩欧美1区 | 天美传媒果冻传媒 | 精品成人日韩欧美软件 | 国产拍拍拍无码视频免费 | 日韩av午夜无码专区 | 国产精品毛片久久久久久 | 国产精品人妻一区二区三区四 | 国产高清在线91 | 97视频在线观看精品 | 亚洲日韩一区二区一 | av在线中文字幕不卡电影网 | 欧美成人精品高清在线播放 | 国产在线视频二区不卡 | 精品人人妻人人澡人人爽牛牛 | 亚洲av无码一区二区三区在线观看 | 国产亚洲成归v人片在线观看 | 在线不卡长片av | 亚洲精品国产一区黑色丝袜 | 国产91精品高清一区二区三区 | 91视频91自拍国产自拍在线观看 | 国产精品大片 | 久久99精品久久久久久久清纯 | 国产精品亚洲欧洲人成网站 | 亚洲性爱av免费在线播放 | 欧美日韩亚洲动漫在线 | 日韩国产成人av在线 | 国产人成高清视频在线观看免费 | 国产亚洲av人片在线观看 | 日本高清一区二区三区中文字幕 | 91果冻传媒app | 久久99热66这里只有精品一 | 久久成人免费观看全部免费 | 成全漫画| 欧美日韩一区二区三区在线视频 | 三级电影韩国中文字幕久久 | 国产v综合v亚洲欧美久久 | 欧美成人精品三级网站在线观看 | 亚洲av午夜国产精品无码中文字 | 福利视频导航大全 | 丰满少妇伦精品无码专区 | 亚洲精品综| 国产精品一区二区三区在线 | 黄页免费在线 | 欧美精品系列一区二区 | 国产精品自在线 | 互换人妻中文字幕 | 国产露脸对白91精品 | 91精品国产高清自在线看香蕉网 | 亚洲精品无码久久久久av麻豆 | 97久久精品一区二区三区剧情介绍 | 97制片厂爱豆传媒视频在线 | 四虎影视久久久免费 | 国产日韩精品一区二区在线观 | 亚洲a∨午| 国产成人亚洲高清明星换脸区 | 日本高清一级婬片a级中文字幕 | 欧美色欧美亚洲高清在线视频 | 国产黃色精品三級一区二区 | 91丝袜在线观看 | 午夜福利伦伦电影理论片在线观看 | 禁漫天堂不知火舞 | 国产欧美日韩综合在线成 | 91字幕 | 中日韩一区二区在线观看 | 很黄很色很爽的三级视频 | 丰满人妻一区二区三区46 | 激情视频国产精品 | 无码激情精品专区在线观看 | 亚洲日韩欧美另类蜜桃 | 午夜亚洲av日韩av无码大全 | 国产一级a毛一级a看免费视频 | 91剧情国产极品高跟丝袜 | 无码乱人伦一区二区亚洲一 | 老司机午夜精品99久久免费 | 97久久| 精品国产成人t | 国产在线自在拍91 | 午夜三级a三级三点在线观看 | 91免费无码国产在线观看i | 无码a√毛片一区二区三区 无码aⅴ精 | 久久www免费 | 人妻av无码中文专区久久 | 亚洲乱码精品久久久久.. | 91蜜桃传媒精品久久久一区二 | 三年片免费观看大全 | 日本经典电影在线观看 | 国产人伦视频在线观看 | 色老板在线视频一区二区 | 欧美精品91久久久 | 欧美又粗又大xxxxbbbb疯狂 | 性行为视频无码 | 欧美熟妇三级在线观看 | 少妇精品久久久一区二区三区 | 国产亚洲一区在线观看一区二区 | 国产刺激对白国产情侣 | 国产精品无码dvd在线观看 | 97制片厂爱豆传媒 | 99热视热频这里只有精 | 精品国产影片在线观看 | 国产精品人人爽人 | 国产sm主人调教女m视频 | 国产l精| 欧美综合区自拍亚洲综合 | 国产精欧美一区二区三区 | 无码人妻精品一区二区三区99 | 区二区三区综合片 | 一区二区三区精品视频 | 91在线无码精品秘网站入口 | 在线播放国产精品三级 | 黄网站色成年片大免费高清 | 欧美极品另类ⅴideosde | 岛国美女| 日本欧美一区二区三区不卡视频 | www.av视频| 久久成年人视频 | 中文字幕精品久久久久人妻红杏1 | 午夜福利在线观看大片 | 国内精品久久久视频 | 亚洲av无码男人的天堂 | 97久久精品 | 欧美日韩国产码高清综合人成 | 怡红院成永久免费人全部视频 | 91免费无码国产在线观看i | 亚洲性爱无码视 | 亚洲av成人一区二区三区观看 | 91在线精品 | 久久91亚洲精品久久91综合 | 精品国产一区二区三区无码 | 日韩欧美自 | 精品国产福利片在线观看 | 欧美精品久久久久久久久爆乳 | 91精品国产麻豆91久久久久久 | 天天爽夜夜爽人人爽一区二区 | 无码人妻丰满熟妇精品区 | 亚洲变态欧美另类精品 | 国产av无码专区亚洲a∨毛片 | 日本免费三片在线播放 | 国产sm主人调教女m视频 | 亚洲成人色| 国产成人无码精品一区 | 三级片视频在线观看 | 亚洲国产综合久久久精品 | 亚洲成av人影院在线观看网 | 精品久久无码中文 | 无码专区一va亚洲v专区在线 | 成人性色生活片免费看爆迷你毛片 | 国产精品网站在线观看免费传媒 | 亚洲日本一区二区 | 亚洲av无码乱码在线观看 | 国产精品一区二区久久宅男 | 精品国产免费观看一区高清 | 国产呦系列视频网 | 亚洲爆乳精品无码一区二区 | 亚洲av丰满熟妇在线播放 | 成人a毛片免费全部播放 | 欧美大片黑寡妇免费观看 | 人人曰人人做 | 内射后入在线观看一区 | 国产av一区二区三区 | 无码三级香港经典三级在线视频 | 波多野结衣一区二区免费视频 | 无码毛片 | 究竟是人性的扭曲还是道德的沦丧 | 国产午夜福利片在线观看 | 在线成人免费视频 | 动漫精品一区二区三区视频 | 国产精品视频一区二区三区不卡 | 国产ⅴ片在线播放免费无码 | 亚洲国产第 | 色碰视频| 99在线观看免费 | 国产一区二区在线播放 | 国语自产精品视频 | 国产中文 | 91精品国产白丝在线观看 | 日韩精品在线免费 | 无码国产在线 | 成人av鲁丝片一区二区免费 | 国产私密网站入口 | 国产一区日韩精品欧美在线 | 99精品视频久久精品视频 | 亚洲影院丰满少妇中文字幕无码 | 三上悠亚免费一区二区在线 | 日本精品高清一区二区97伦理电影 | 狠狠躁天天躁无码字幕 | 欧洲av无码放荡人妇网站 | 亚洲欧美激情综合第一区 | 欧美日韩三级电影在线观看 | 性色av一区二区三区无码 | 国产亚洲中文字幕 | 护士长在办公室躁bd剧情堪比大片 | 狠狠躁天天躁无码字幕 | 国产无遮挡裸露视频免费 | 高潮毛片无遮挡免费高清 | 九九视频精品全部免费播放 | 99这里只有精品在线 | 国产成人亚洲精品狼色在线 | 欧美日韩午夜一区二区 | 插逼网站 | 丰满少妇被猛烈高清播放 | 91极品视频在线观 | 亚洲欧美日本综合一区二区 | 国产aⅴ精品一区二 | 熟妇人妻午夜寂寞影院 | 国产精品亚洲欧美—级久久精品 | 国产亚洲成归v人片在线观看 | av免费网址在线看 | 97超碰中文字幕久久精品 | 91天堂| 国产亚洲精品久久久久秋霞 | 国产精品无码一区二区三区在 | 无码刺激性av完整版 | 人人人97人妻交换视 | 成人精品一区二区三区中文字幕 | 亚洲国产av一区二区三区 | 波多野结衣hd系列在线播放 | 中文字幕人成 | 国产午夜小视频 | 99热最新地址永久 | 综合色区亚洲熟妇另类 | 国产猛男猛女超爽免费视频 | 精品亚洲线在观看 | 99久久免费看片 | 超碰97资源站 | 91天堂素人精品系列全集亚洲 | 国产欧美一区二区精品久久久 | 91国偷自产一区二区三区蜜臀 | 国产精品剧情久久久久 | 国产jk| 麻豆精品无人区码 | 99精品久| 国产真实露脸乱子伦 | 日韩精品一区二区三区四区蜜桃 | 亚洲中文字幕无码久久 | 丰满人妻熟妇乱又伦精品视 | 国产麻豆精品久久久 | 91精品免费国产高清在线 | 日本韩高清视频一区二区三区免费式 | 九一果冻制品厂推出新剧达达兔 | 成年女人看片永久免费视频 | 亚洲日韩欧美另类蜜桃 | 国产在线ts人妖免费视频 | 国产aⅴ视频一区二区三区 国产aⅴ天堂亚洲国产av | 亚洲午夜在线观看 | 国产va免费精品观看 | 欧美日韩中文在线字幕视频 | 在线看片免费人成视久网 | 久本草在线中文字幕 | 成人在免费视频手机观看网站 | av在线亚洲男人的天堂 | 亚洲成人av片在线观看无码 | 国产精品免费小视频 | 亚洲无码国产片 | 91精品综合在线视频 | 无码精品国产一区二区 | 国产精品自产18禁 | 97精品无码永久在线 | 精品无码av毛片一区二区三区 | 99热国产这里只有精品 | 麻豆av传媒蜜桃天美 | 欧美生活大片在线观看 | 欧洲一曲二曲三曲视频 | 91麻豆国产极品在线观看洋子 | 99不卡无码中文字幕在线 | 国产亚洲色视频在线 | 国内精品九九久久精品一本 | 91综合精品网站久久 | 无码精品一区二区三区免费视频 | 国产h片在线观看视 | 成人午夜福利短视频在线观 | 国产精品三级在线观看无码 | 国产乱码精品一区二区三区 | 国产精品久 | 91嫩草私人成人亚洲影院 | 深夜福利啪啪片 | 99久久久久国产精品免费 | 91精品在线免费观看 | 国产亚洲日韩av在线播放 | 成人片黄网 | 福利姬液液酱喷水 | 亚洲欧美国产日韩精品在线 | 99久久人妻精品无码二区 | 国产99一区视频免费 | 91亚洲精品自 | 欧美成人午夜免费福利785 | 99爱视频99爱在线观看 | 精品久久久久久中文字幕人妻 | 欧美亚洲精品一级毛淫片 | 欧美日韩精品一区二区三区 | 韩国无码一区二区三区在线观看 | 亚洲第一黄色网址 | 亚洲精品一二三四区 | 日本欧美亚洲综合久久久 | 亚洲无码免费在线小视频 | 最新国产在线精品91尤物 | 91成人黄色视频在线观看 | 国产成人精品高清国产三级 | 日本中文一二区有码在线观看 | 少妇被躁爽到高潮无码人狍大战 | 井之原游戏网 | 精品欧美日韩视频一区二区 | 中文韩国日本免费不卡五月天成人 | 91啪国自产在线高清观看 | 亚洲成av人网站在线播放 | 绘本软件园 | 欧美日韩一区二区三区在线视频 | 亚洲av成人无| 国产成人无码视频一区二区三 | 国外精品视频在线 | 91久久精品夜夜躁日日躁欧美 | 亚洲欧美日韩精 | 亚洲日本韩国在线 | 国产极品性色一区二区三区 | 国产日韩欧美另类视频 | 国产免费人成视频尤勿视频 | 成年片色大黄全免费网 | 亚洲爆乳无 | 女性高爱潮aaaa级视频免费 | 人人妻人 | 国产精品宾馆 | 亚洲无码码视频在线观看 | 精品无码黑人又粗又大又长 | 日本高清在 | 99精品久 | 精品欧美一区二区三区四区 | 成人自拍一区 | 国产精品无码一区二 | av无码天堂一区二区三区 | 国产亚洲精品久久久久秋霞 | 国产乱色精品成 | 无码中文字幕一二三区 | 97精品精品一区二区 | 99国产成人高清在线观看 | 国产精品午睡沙发系列 | 麻豆成人91久久精品二区三区 | 国产精品亚洲专区在线观看 | 91九色熟女| 国产漂亮白嫩美女在线观看 | 精品国产av无码一区二区三区 | 国产婷婷高清在线观看免费 | 一级无码片中文 | 97视频播放器安卓版v1.11 | 91香蕉短视频 | 91视频导航 | 国产精品亚洲一区二区三区在线 | 爱豆传媒免费全集在线观看 | 高清一区二区 | 精品无码一区二区三区在线 | 91在线导航| 精品久久免费 | 中文字幕不卡高清视频在线 | 97人人超人人超国产免费 | 日韩电影免费在线观看中文字幕 | 国产福利精品 | 色综合蜜桃视频在线观看 | 国产成人精品一区二三区在线观看 | 欧美极品尤物在线播放一级 | 人妻无码aⅴ中文系列久久免费 | 成av人最新无码 | 成人亚洲国产精品一区不卡 | 亚洲欧美一 | 无码欧美熟妇人妻影院欧美潘金莲 | 国产无遮挡无码免费视频在线抪 | 韩国无码一区二区三区在线观看 | 亚洲成α人片在线观看欧美在线视频 | 中文字幕久久久久一区 | 人妻熟妇久久久久久xxx | 国产探花视频 | 熟妇人妻系列aⅴ无码专区友 | 国产精品精品自在线拍 | 蜜臀色欲av在线播放国产日韩 | 日本一区二区三区免费播放视频站 | 九九線視頻在線 | 91香蕉视频免费 | 丝袜灬啊灬快灬高潮了av | 国产99久久 | 97精品国产高清自在线看超 | 精品福利一区二区视频 | 在线日韩欧美日本国产 | 国产一区视频观看 | 精品蜜臀久久久久99网站 | 久久电影| 亚洲国产va乱码毛片一级高清三 | 日韩成人精品视频国产在线观看成人 | 天堂亚洲国产日韩在线看 | 日韩欧美视频免费一区二区三区 | 97电影院| 国产欧美中文字幕 | 成年人毛片网 | 亚洲日韩精品免费视频91蜜桃 | 99久久久免费国产精品 | 国模冰莲自慰肥美胞极品人体图 | 中文字幕在线免费观看 | 亚洲国产一区二区精品专区 | 97久久精品无码一区二区欧美人 | 欧美日韩高清中文在线 | 亚洲午夜一级高清免费 | 波多野结衣乳巨码无在线观看 | 欧美日韩在线免费一区二区三区 | 波多野结衣办公室双飞 | 成年入口无 | 亚洲国产日韩欧美一区二区三区 | 日韩人妻无码一区二区三区久 | 黄色网页在线观看 | 日本三区视频 | 亚洲国产av无码精品色午夜 | 久久99久久精品免观看吃奶 | 99爱精品视频公开免费观看 | 日韩精品福利片午夜免费 | 91精品国产免费青青碰在线 | 欧美精品aⅴ在线视频 | 人人妻人人澡人人爽欧美一区双 | 99久久午夜精品一区二区欧美 | 国产日本高清在线观看 | 午夜热门精品一区二区三区 | 动漫3d精品一区二区三区乱码 | 国产v片在线播放 | 国产免费网站看v片在线软件 | 午夜精品国产爱在线观看不卡 | 国产av一区二区三区无码野战 | 国产综合久久久久影院 | 天天看片亚洲欧美国产 | 国产成人免费av片在线观看 | 91精品无人区麻豆乱码4区开放时间 | 午夜性爽一区二区三区 | 91视频www| 黄色视频免费观看 | 97国产在线一区不卡 | 亚洲av无码资源在 | 国产成人无码av片在线观看 | 91精品一区二区综合在线 | 91精品全国免费观看 | 国产免费又色又爽又黄软件 | 国产人妻777人伦精品hd | 亚洲成a人片在线观看中文无码 | 996热国产在线精品 99999久久久久久亚洲 | 亚洲日韩在线观看不卡 | 国产欧美日韩亚洲一区二区三区 | 无码国产精品一区二区免费 | 国产在线观看免费无码 | 九九九亚洲精品 | 日本一道本中文字幕 | 91破解版免费版无限量丝瓜 | 国产成人精品综合在线观看 | 国产在线98福利播放视频 | 国产美女裸体无遮掩免费牛牛 | 天天看片亚洲欧美国产 | 中文字幕亚洲无线码在线中 | 国产欧美va天堂在线观看视频 | av免费网址在线看 | 9lporm自拍视频区 | 91精品国产麻豆国产自产 | 天天干夜夜操狠狠干 | 91大神精品视频 | 久久超碰精品一 | 国产成人a在线观看视频 | 精品久久久久久久久久中文字幕 | 免费一区二区 | 国产精品高清另类一区二区三区 | 九九九九国产热视频在线 | 亚洲欧美一区二区不卡国产 | 无码人妻免费—区二区三 | 精品国产3p一|