超碰91资源站-超碰97豆花-超碰97人妻-超碰97人人干-超碰97人人香蕉-超碰97天天操-超碰97在线资源站-超碰97资源站共享-超碰97资源站总站-超碰aa在线91-超碰av操-超碰爱爱

半岛外围网上直营

logo Swift編程語言中文教程

文檔半島外圍網(wǎng)上直營>>Swift編程語言中文教程>>Swift編程語言中文教程(二十一):Swift協(xié)議

Swift編程語言中文教程(二十一):Swift協(xié)議


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

Protocol(協(xié)議)用于統(tǒng)一方法和屬性的名稱,而不實現(xiàn)任何功能。協(xié)議能夠被類,枚舉,結(jié)構(gòu)體實現(xiàn),滿足協(xié)議要求的類,枚舉,結(jié)構(gòu)體被稱為協(xié)議的遵循者。

遵循者需要提供協(xié)議指定的成員,如屬性,方法,操作符,下標(biāo)等。

協(xié)議的語法

協(xié)議的定義與類,結(jié)構(gòu)體,枚舉的定義非常相似,如下所示:

protocol SomeProtocol {
    // 協(xié)議內(nèi)容
}

在類,結(jié)構(gòu)體,枚舉的名稱后加上協(xié)議名稱,中間以冒號:分隔即可實現(xiàn)協(xié)議;實現(xiàn)多個協(xié)議時,各協(xié)議之間用逗號,分隔,如下所示:

struct SomeStructure: FirstProtocol, AnotherProtocol {
    // 結(jié)構(gòu)體內(nèi)容
}

當(dāng)某個類含有父類的同時并實現(xiàn)了協(xié)議,應(yīng)當(dāng)把父類放在所有的協(xié)議之前,如下所示:

class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 類的內(nèi)容
}

屬性要求

協(xié)議能夠要求其遵循者必須含有一些特定名稱和類型的實例屬性(instance property)或類屬性 (type property),也能夠要求屬性具有(設(shè)置權(quán)限)settable 和(訪問權(quán)限)gettable,但它不要求屬性是存儲型屬性(stored property)還是計算型屬性(calculate property)。

如果協(xié)議要求屬性具有設(shè)置權(quán)限和訪問權(quán)限,那常量存儲型屬性或者只讀計算型屬性都無法滿足此要求。如果協(xié)議只要求屬性具有訪問權(quán)限,那任何類型的屬性都可以滿足此要求,無論這些屬性是否具有設(shè)置權(quán)限。

通常前置var關(guān)鍵字將屬性聲明為變量。在屬性聲明后寫上{ get set }表示屬性為可讀寫的。{ get }用來表示屬性為可讀的。即使你為可讀的屬性實現(xiàn)了setter方法,它也不會出錯。

protocol SomeProtocol {
    var musBeSettable : Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}

在協(xié)議中定義類屬性 (type property)時使用class前綴關(guān)鍵字,即使在結(jié)構(gòu)體或者枚舉中類屬性是要求使用static前綴關(guān)鍵字:

protocol AnotherProtocol {
    class var someTypeProperty: Int { get set }
}

protocol FullyNamed {
    var fullName: String { get }
}

FullyNamed協(xié)議含有fullName屬性。因此其遵循者必須含有一個名為fullName,類型為String的可讀屬性。

struct Person: FullyNamed{
    var fullName: String
}
let john = Person(fullName: "John Appleseed")
//john.fullName 為 "John Appleseed" 

Person結(jié)構(gòu)體含有一個名為fullName的存儲型屬性,完整的遵循了協(xié)議。(若協(xié)議未被完整遵循,編譯時則會報錯)。

如下所示,Startship類遵循了FullyNamed協(xié)議:

class Starship: FullyNamed {
    var prefix: String?
    var name: String
    init(name: String, prefix: String? = nil ) {
        self.anme = name
        self.prefix = prefix
    }
    var fullName: String {
    return (prefix ? prefix ! + " " : " ") + name
    }
}
var ncc1701 = Starship(name: "Enterprise", prefix: "USS")
// ncc1701.fullName == "USS Enterprise"

Starship類將fullName實現(xiàn)為可讀的計算型屬性。它的每一個實例都有一個名為name的必備屬性和一個名為prefix的可選屬性。 當(dāng)prefix存在時,將prefix插入到name之前來為Starship構(gòu)建fullName。

方法要求

協(xié)議能夠要求其遵循者必備某些特定的實例方法和類方法。協(xié)議方法的聲明與普通方法聲明相似,但它不需要方法內(nèi)容。

注意: 協(xié)議方法支持變長參數(shù)(variadic parameter),不支持默認(rèn)參數(shù)(default parameter)。

前置class關(guān)鍵字表示協(xié)議中的成員為類成員;當(dāng)協(xié)議用于被枚舉或結(jié)構(gòu)體遵循時,則使用static關(guān)鍵字。如下所示: 像類屬性的要求一樣,協(xié)議中定義類方法時也總是使用class關(guān)鍵字,即使類方法在枚舉或結(jié)構(gòu)體中實現(xiàn)時要求使用static關(guān)鍵字

protocol SomeProtocol {
    class func someTypeMethod()
}

protocol RandomNumberGenerator {
    func random() -> Double
}

RandomNumberGenerator協(xié)議要求其遵循者必須擁有一個名為random, 返回值類型為Double的實例方法。(我們假設(shè)隨機(jī)數(shù)在[0,1]區(qū)間內(nèi))。

LinearCongruentialGenerator類遵循了RandomNumberGenerator協(xié)議,并提供了一個叫做線性同余生成器(linear congruential generator)的偽隨機(jī)數(shù)算法。

class LinearCongruentialGenerator: RandomNumberGenerator {
    var lastRandom = 42.0
    let m = 139968.0
    let a = 3877.0
    let c = 29573.0
    func random() -> Double {
        lastRandom = ((lastRandom * a + c) % m)
        return lastRandom / m
    }
}
let generator = LinearCongruentialGenerator()
println("Here's a random number: \(generator.random())")
// 輸出 : "Here's a random number: 0.37464991998171"
println("And another one: \(generator.random())")
// 輸出 : "And another one: 0.729023776863283"

突變方法要求

能在方法或函數(shù)內(nèi)部改變實例類型的方法稱為突變方法。在值類型(Value Type)(譯者注:特指結(jié)構(gòu)體和枚舉)中的的函數(shù)前綴加上mutating關(guān)鍵字來表示該函數(shù)允許改變該實例和其屬性的類型。 這一變換過程在實例方法(Instance Methods)章節(jié)中有詳細(xì)描述。

(譯者注:類中的成員為引用類型(Reference Type),可以方便的修改實例及其屬性的值而無需改變類型;而結(jié)構(gòu)體和枚舉中的成員均為值類型(Value Type),修改變量的值就相當(dāng)于修改變量的類型,而Swift默認(rèn)不允許修改類型,因此需要前置mutating關(guān)鍵字用來表示該函數(shù)中能夠修改類型)

注意: 用class實現(xiàn)協(xié)議中的mutating方法時,不用寫mutating關(guān)鍵字;用結(jié)構(gòu)體,枚舉實現(xiàn)協(xié)議中的mutating方法時,必須寫mutating關(guān)鍵字。

如下所示,Togglable協(xié)議含有toggle函數(shù)。根據(jù)函數(shù)名稱推測,toggle可能用于切換或恢復(fù)某個屬性的狀態(tài)。mutating關(guān)鍵字表示它為突變方法:

protocol Togglable {
    mutating func toggle()
}

當(dāng)使用枚舉或結(jié)構(gòu)體來實現(xiàn)Togglabl協(xié)議時,必須在toggle方法前加上mutating關(guān)鍵字。

如下所示,OnOffSwitch枚舉遵循了Togglable協(xié)議,On,Off兩個成員用于表示當(dāng)前狀態(tài)

enum OnOffSwitch: Togglable {
    case Off, On
    mutating func toggle() {
        switch self {
        case Off:
            self = On
        case On:
            self = Off
        }
    }
}
var lightSwitch = OnOffSwitch.Off
lightSwitch.toggle()
//lightSwitch 現(xiàn)在的值為 .On

協(xié)議類型

協(xié)議本身不實現(xiàn)任何功能,但你可以將它當(dāng)做類型來使用。

使用場景:

  • 作為函數(shù),方法或構(gòu)造器中的參數(shù)類型,返回值類型
  • 作為常量,變量,屬性的類型
  • 作為數(shù)組,字典或其他容器中的元素類型

注意: 協(xié)議類型應(yīng)與其他類型(Int,Double,String)的寫法相同,使用駝峰式

class Dice {
    let sides: Int
    let generator: RandomNumberGenerator
    init(sides: Int, generator: RandomNumberGenerator) {
        self.sides = sides
        self.generator = generator
    }
    func roll() -> Int {
        return Int(generator.random() * Double(sides)) +1
    }
}

這里定義了一個名為 Dice的類,用來代表桌游中的N個面的骰子。

Dice含有sides和generator兩個屬性,前者用來表示骰子有幾個面,后者為骰子提供一個隨機(jī)數(shù)生成器。由于后者為RandomNumberGenerator的協(xié)議類型。所以它能夠被賦值為任意遵循該協(xié)議的類型。

此外,使用構(gòu)造器(init)來代替之前版本中的setup操作。構(gòu)造器中含有一個名為generator,類型為RandomNumberGenerator的形參,使得它可以接收任意遵循RandomNumberGenerator協(xié)議的類型。

roll方法用來模擬骰子的面值。它先使用generator的random方法來創(chuàng)建一個[0-1]區(qū)間內(nèi)的隨機(jī)數(shù)種子,然后加工這個隨機(jī)數(shù)種子生成骰子的面值。

如下所示,LinearCongruentialGenerator的實例作為隨機(jī)數(shù)生成器傳入Dice的構(gòu)造器

var d6 = Dice(sides: 6,generator: LinearCongruentialGenerator())
for _ in 1...5 {
    println("Random dice roll is \(d6.roll())")
}
//輸出結(jié)果
//Random dice roll is 3
//Random dice roll is 5
//Random dice roll is 4
//Random dice roll is 5
//Random dice roll is 4

委托(代理)模式

委托是一種設(shè)計模式,它允許類或結(jié)構(gòu)體將一些需要它們負(fù)責(zé)的功能交由(委托)給其他的類型。

委托模式的實現(xiàn)很簡單: 定義協(xié)議來封裝那些需要被委托的函數(shù)和方法, 使其遵循者擁有這些被委托的函數(shù)和方法。

委托模式可以用來響應(yīng)特定的動作或接收外部數(shù)據(jù)源提供的數(shù)據(jù),而無需要知道外部數(shù)據(jù)源的類型。

下文是兩個基于骰子游戲的協(xié)議:

protocol DiceGame {
    var dice: Dice { get }
    func play()
}

protocol DiceGameDelegate {
    func gameDidStart(game: DiceGame)
    func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll:Int)
    func gameDidEnd(game: DiceGame)
}

DiceGame協(xié)議可以在任意含有骰子的游戲中實現(xiàn),DiceGameDelegate協(xié)議可以用來追蹤DiceGame的游戲過程。

如下所示,SnakesAndLadders是Snakes and Ladders(譯者注:控制流章節(jié)有該游戲的詳細(xì)介紹)游戲的新版本。新版本使用Dice作為骰子,并且實現(xiàn)了DiceGame和DiceGameDelegate協(xié)議

class SnakesAndLadders: DiceGame {
    let finalSquare = 25
    let dic = Dice(sides: 6, generator: LinearCongruentialGenerator())
    var square = 0
    var board: Int[]
    init() {
        board = Int[](count: finalSquare + 1, repeatedValue: 0)
        board[03] = +08; board[06] = +11; borad[09] = +09; board[10] = +02
        borad[14] = -10; board[19] = -11; borad[22] = -02; board[24] = -08
    }
     var delegate: DiceGameDelegate?
     func play() {
         square = 0
         delegate?.gameDidStart(self)
         gameLoop: while square != finalSquare {
             let diceRoll = dice.roll()
             delegate?.game(self,didStartNewTurnWithDiceRoll: diceRoll)
             switch square + diceRoll {
             case finalSquare:
                 break gameLoop
             case let newSquare where newSquare > finalSquare:
                 continue gameLoop
             default:
             square += diceRoll
             square += board[square]
             }
         }
         delegate?.gameDIdEnd(self)
     }
}

游戲的初始化設(shè)置(setup)被SnakesAndLadders類的構(gòu)造器(initializer)實現(xiàn)。所有的游戲邏輯被轉(zhuǎn)移到了play方法中。

注意: 因為delegate并不是該游戲的必備條件,delegate被定義為遵循DiceGameDelegate協(xié)議的可選屬性

DicegameDelegate協(xié)議提供了三個方法用來追蹤游戲過程。被放置于游戲的邏輯中,即play()方法內(nèi)。分別在游戲開始時,新一輪開始時,游戲結(jié)束時被調(diào)用。

因為delegate是一個遵循DiceGameDelegate的可選屬性,因此在play()方法中使用了可選鏈來調(diào)用委托方法。 若delegate屬性為nil, 則委托調(diào)用優(yōu)雅地失效。若delegate不為nil,則委托方法被調(diào)用

如下所示,DiceGameTracker遵循了DiceGameDelegate協(xié)議

class DiceGameTracker: DiceGameDelegate {
    var numberOfTurns = 0
    func gameDidStart(game: DiceGame) {
        numberOfTurns = 0
        if game is SnakesAndLadders {
            println("Started a new game of Snakes and Ladders")
        }
        println("The game is using a \(game.dice.sides)-sided dice")
    }
    func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) {
        ++numberOfTurns
        println("Rolled a \(diceRoll)")
    }
    func gameDidEnd(game: DiceGame) {
        println("The game lasted for \(numberOfTurns) turns")
    }
}

DiceGameTracker實現(xiàn)了DiceGameDelegate協(xié)議的方法要求,用來記錄游戲已經(jīng)進(jìn)行的輪數(shù)。 當(dāng)游戲開始時,numberOfTurns屬性被賦值為0;在每新一輪中遞加;游戲結(jié)束后,輸出打印游戲的總輪數(shù)。

gameDidStart方法從game參數(shù)獲取游戲信息并輸出。game在方法中被當(dāng)做DiceGame類型而不是SnakeAndLadders類型,所以方法中只能訪問DiceGame協(xié)議中的成員。

DiceGameTracker的運行情況,如下所示:

let tracker = DiceGameTracker()
let game = SnakesAndLadders()
game.delegate = tracker
game.play()
// Started a new game of Snakes and Ladders
// The game is using a 6-sided dice
// Rolled a 3
// Rolled a 5
// Rolled a 4
// Rolled a 5
// The game lasted for 4 turns

在擴(kuò)展中添加協(xié)議成員

即便無法修改源代碼,依然可以通過擴(kuò)展(Extension)來擴(kuò)充已存在類型(譯者注: 類,結(jié)構(gòu)體,枚舉等)。擴(kuò)展可以為已存在的類型添加屬性,方法,下標(biāo),協(xié)議等成員。詳情請在擴(kuò)展章節(jié)中查看。

注意: 通過擴(kuò)展為已存在的類型遵循協(xié)議時,該類型的所有實例也會隨之添加協(xié)議中的方法

TextRepresentable協(xié)議含有一個asText,如下所示:

protocol TextRepresentable {
    func asText() -> String
}

通過擴(kuò)展為上一節(jié)中提到的Dice類遵循TextRepresentable協(xié)議

extension Dice: TextRepresentable {
    cun asText() -> String {
        return "A \(sides)-sided dice"
    }
}

從現(xiàn)在起,Dice類型的實例可被當(dāng)作TextRepresentable類型:

let d12 = Dice(sides: 12,generator: LinearCongruentialGenerator())
println(d12.asText())
// 輸出 "A 12-sided dice"

SnakesAndLadders類也可以通過擴(kuò)展的方式來遵循協(xié)議:

extension SnakeAndLadders: TextRepresentable {
    func asText() -> String {
        return "A game of Snakes and Ladders with \(finalSquare) squares"
    }
}
println(game.asText())
// 輸出 "A game of Snakes and Ladders with 25 squares"

通過擴(kuò)展補(bǔ)充協(xié)議聲明

當(dāng)一個類型已經(jīng)實現(xiàn)了協(xié)議中的所有要求,卻沒有聲明時,可以通過擴(kuò)展來補(bǔ)充協(xié)議聲明:

struct Hamster {
    var name: String
    func asText() -> String {
        return "A hamster named \(name)"
    }
}
extension Hamster: TextRepresentabl {}

從現(xiàn)在起,Hamster的實例可以作為TextRepresentable類型使用

let simonTheHamster = Hamster(name: "Simon")
let somethingTextRepresentable: TextRepresentabl = simonTheHamester
println(somethingTextRepresentable.asText())
// 輸出 "A hamster named Simon"

注意: 即時滿足了協(xié)議的所有要求,類型也不會自動轉(zhuǎn)變,因此你必須為它做出明顯的協(xié)議聲明

集合中的協(xié)議類型

協(xié)議類型可以被集合使用,表示集合中的元素均為協(xié)議類型:

let things: TextRepresentable[] = [game,d12,simoTheHamster]

如下所示,things數(shù)組可以被直接遍歷,并調(diào)用其中元素的asText()函數(shù):

for thing in things {
    println(thing.asText())
}
// A game of Snakes and Ladders with 25 squares
// A 12-sided dice
// A hamster named Simon

thing被當(dāng)做是TextRepresentable類型而不是Dice,DiceGame,Hamster等類型。因此能且僅能調(diào)用asText方法

協(xié)議的繼承

協(xié)議能夠繼承一到多個其他協(xié)議。語法與類的繼承相似,多個協(xié)議間用逗號,分隔

protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
    // 協(xié)議定義
}

如下所示,PrettyTextRepresentable協(xié)議繼承了TextRepresentable協(xié)議

protocol PrettyTextRepresentable: TextRepresentable {
    func asPrettyText() -> String
} 

遵循``PrettyTextRepresentable協(xié)議的同時,也需要遵循TextRepresentable`協(xié)議。

如下所示,用擴(kuò)展為SnakesAndLadders遵循PrettyTextRepresentable協(xié)議:

extension SnakesAndLadders: PrettyTextRepresentable {
    func asPrettyText() -> String {
        var output = asText() + ":\n"
        for index in 1...finalSquare {
            switch board[index] {
                case let ladder where ladder > 0:
                output += "▲ "
            case let snake where snake < 0:
                output += "▼ "
            default:
                output += "○ "
            }
        }
        return output
    }
}

在for in中迭代出了board數(shù)組中的每一個元素:

  • 當(dāng)從數(shù)組中迭代出的元素的值大于0時,用▲表示
  • 當(dāng)從數(shù)組中迭代出的元素的值小于0時,用▼表示
  • 當(dāng)從數(shù)組中迭代出的元素的值等于0時,用○表示

任意SankesAndLadders的實例都可以使用asPrettyText()方法。

println(game.asPrettyText())
// A game of Snakes and Ladders with 25 squares:
// ○ ○ ▲ ○ ○ ▲ ○ ○ ▲ ▲ ○ ○ ○ ▼ ○ ○ ○ ○ ▼ ○ ○ ▼ ○ ▼ ○

協(xié)議合成

一個協(xié)議可由多個協(xié)議采用protocol<SomeProtocol, AnotherProtocol>這樣的格式進(jìn)行組合,稱為協(xié)議合成(protocol composition)。

舉個例子:

protocol Named {
    var name: String { get }
}
protocol Aged {
    var age: Int { get }
}
struct Person: Named, Aged {
    var name: String
    var age: Int
}
func wishHappyBirthday(celebrator: protocol<Named, Aged>) {
    println("Happy birthday \(celebrator.name) - you're \(celebrator.age)!")
}
let birthdayPerson = Person(name: "Malcolm", age: 21)
wishHappyBirthday(birthdayPerson)
// 輸出 "Happy birthday Malcolm - you're 21!

Named協(xié)議包含String類型的name屬性;Aged協(xié)議包含Int類型的age屬性。Person結(jié)構(gòu)體遵循了這兩個協(xié)議。

wishHappyBirthday函數(shù)的形參celebrator的類型為protocol<Named,Aged>。可以傳入任意遵循這兩個協(xié)議的類型的實例

注意: 協(xié)議合成并不會生成一個新協(xié)議類型,而是將多個協(xié)議合成為一個臨時的協(xié)議,超出范圍后立即失效。

檢驗協(xié)議的一致性

使用is檢驗協(xié)議一致性,使用as將協(xié)議類型向下轉(zhuǎn)換(downcast)為的其他協(xié)議類型。檢驗與轉(zhuǎn)換的語法和之前相同(詳情查看類型檢查):

  • is操作符用來檢查實例是否遵循了某個協(xié)議。
  • as?返回一個可選值,當(dāng)實例遵循協(xié)議時,返回該協(xié)議類型;否則返回nil
  • as用以強(qiáng)制向下轉(zhuǎn)換型。
@objc protocol HasArea {
    var area: Double { get }
}

注意: @objc用來表示協(xié)議是可選的,也可以用來表示暴露給Objective-C的代碼,此外,@objc型協(xié)議只對類有效,因此只能在類中檢查協(xié)議的一致性。詳情查看

class Circle: HasArea {
    let pi = 3.1415927
    var radius: Double
    var area:≈radius }
    init(radius: Double) { self.radius = radius }
}
class Country: HasArea {
    var area: Double
    init(area: Double) { self.area = area }
}

Circle和Country都遵循了HasArea協(xié)議,前者把a(bǔ)rea寫為計算型屬性(computed property),后者則把a(bǔ)rea寫為存儲型屬性(stored property)。

如下所示,Animal類沒有實現(xiàn)任何協(xié)議

class Animal {
    var legs: Int
    init(legs: Int) { self.legs = legs }
}

Circle,Country,Animal并沒有一個相同的基類,所以采用AnyObject類型的數(shù)組來裝載在它們的實例,如下所示:

let objects: AnyObject[] = [
    Circle(radius: 2.0),
    Country(area: 243_610),
    Animal(legs: 4)
]

如下所示,在迭代時檢查object數(shù)組的元素是否遵循了HasArea協(xié)議:

for object in objects {
    if let objectWithArea = object as? HasArea {
        println("Area is \(objectWithArea.area)")
    } else {
        println("Something that doesn't have an area")
    }
}
// Area is 12.5663708
// Area is 243610.0
// Something that doesn't have an area

當(dāng)數(shù)組中的元素遵循HasArea協(xié)議時,通過as?操作符將其可選綁定(optional binding)到objectWithArea常量上。

objects數(shù)組中元素的類型并不會因為向下轉(zhuǎn)型而改變,當(dāng)它們被賦值給objectWithArea時只被視為HasArea類型,因此只有area屬性能夠被訪問。

可選協(xié)議要求

可選協(xié)議含有可選成員,其遵循者可以選擇是否實現(xiàn)這些成員。在協(xié)議中使用@optional關(guān)鍵字作為前綴來定義可選成員。

可選協(xié)議在調(diào)用時使用可選鏈,詳細(xì)內(nèi)容在可選鏈章節(jié)中查看。

像someOptionalMethod?(someArgument)一樣,你可以在可選方法名稱后加上?來檢查該方法是否被實現(xiàn)。可選方法和可選屬性都會返回一個可選值(optional value),當(dāng)其不可訪問時,?之后語句不會執(zhí)行,并返回nil。

注意: 可選協(xié)議只能在含有@objc前綴的協(xié)議中生效。且@objc的協(xié)議只能被類遵循。

Counter類使用CounterDataSource類型的外部數(shù)據(jù)源來提供增量值(increment amount),如下所示:

@objc protocol CounterDataSource {
    @optional func incrementForCount(count: Int) -> Int
    @optional var fixedIncrement: Int { get }
}

CounterDataSource含有incrementForCount的可選方法和fiexdIncrement的可選屬性。

注意: CounterDataSource中的屬性和方法都是可選的,因此可以在類中聲明但不實現(xiàn)這些成員,盡管技術(shù)上允許這樣做,不過最好不要這樣寫。

Counter類含有CounterDataSource?類型的可選屬性dataSource,如下所示:

@objc class Counter {
    var count = 0
    var dataSource: CounterDataSource?
    func increment() {
        if let amount = dataSource?.incrementForCount?(count) {
            count += amount
        } else if let amount = dataSource?.fixedIncrement? {
            count += amount
        }
    }
}

count屬性用于存儲當(dāng)前的值,increment方法用來為count賦值。

increment方法通過可選鏈,嘗試從兩種可選成員中獲取count。

  1. 由于dataSource可能為nil,因此在dataSource后邊加上了?標(biāo)記來表明只在dataSource非空時才去調(diào)用incrementForCount`方法。
  2. 即使dataSource存在,但是也無法保證其是否實現(xiàn)了incrementForCount方法,因此在incrementForCount方法后邊也加有?標(biāo)記。

在調(diào)用incrementForCount方法后,Int型可選值通過可選綁定(optional binding)自動拆包并賦值給常量amount。

當(dāng)incrementForCount不能被調(diào)用時,嘗試使用可選屬性``fixedIncrement來代替。

ThreeSource實現(xiàn)了CounterDataSource協(xié)議,如下所示:

class ThreeSource: CounterDataSource {
    let fixedIncrement = 3
}

使用ThreeSource作為數(shù)據(jù)源開實例化一個Counter:

var counter = Counter()
counter.dataSource = ThreeSource()
for _ in 1...4 {
    counter.increment()
    println(counter.count)
}
// 3
// 6
// 9
// 12

TowardsZeroSource實現(xiàn)了CounterDataSource協(xié)議中的incrementForCount方法,如下所示:

class TowardsZeroSource: CounterDataSource {
func incrementForCount(count: Int) -> Int {
        if count == 0 {
            return 0
        } else if count < 0 {
            return 1
        } else {
            return -1
        }
    }
}

下邊是執(zhí)行的代碼:

counter.count = -4
counter.dataSource = TowardsZeroSource()
for _ in 1...5 {
    counter.increment()
    println(counter.count)
}
// -3
// -2
// -1
// 0
// 0
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
利記足球官網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 真人boyu·博魚滾球網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 最大網(wǎng)上PM娛樂城盤口(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 正規(guī)雷火競技官方買球(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 雷火競技權(quán)威十大網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) boyu·博魚信譽(yù)足球官網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 權(quán)威188BET足球網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 正規(guī)188BET足球大全(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 精品无码人妻被多人侵犯av | 精品国产sm最大网站 | 国产午夜av秒播 | 国产精品一二三四区视频 | 二区欧美无遮挡中文字幕人成人 | 91久久性奴调教国产免费 | 成人午夜福利在线观看 | 国精产品一品二品国在线 | 91麻豆精品国产片在线观看 | 国产麻豆一区二区三区精品视频 | 国产精品自拍视频合集 | 成人精品视频在线 | 精品人妻码一区二区三区 | 国产拍拍视频一二三四区 | 丰满大乳奶水在线播放 | a级毛片视频免费播放 | 国产精品无码一级毛片 | 91制片国产自产在线观看 | aⅴ天堂 | 国产一区二区日韩欧美在线 | 国产无人区码卡二卡三卡免费 | 国产偷窥在线 | 成人区人妻精品一区二区不卡网站 | 国产成在线观看免费视 | 波多野结衣在线观看一区二区三区 | 国产精品一线二线三线区别解析 | 国产女同调教 | 国产福利秒拍视频大尺度 | 国产自啪精品视频. | 国产亚洲午夜高清国产亚洲 | 91无码人妻aⅴ一区二区三区 | 国产丝袜肉丝视频 | 成人国产综合av片 | 国产精品成人免费公开视频 | 成人精品一区二区户外勾搭野 | 精品无码一区二区三区av | 精品深夜av无码一区二区老年 | 91在线精品亚洲一区二区 | 国产精品v欧美精品v日韩苍 | 丰满少妇高清中文字幕 | 国产一区二区三区成人久久 | 69麻豆天美精东蜜桃传媒潘甜甜 | 国产午夜免费福利红片 | 精品三级久久久久久久电影 | av无码激情一线天 | 91尤物在线视频 | 18禁黄网站禁片免费观看 | 国产成人永久免费视频 | 国产一区二区在线观看麻豆 | 国产精品成熟老妇女 | 国产午夜片无码区在线观看 | 成人av免费网址在线观看 | 成人青青热久免费精品 | 国产午夜在线观看 | 国产精品一区二区三区高清在线 | 92午夜福利影院一区二区三 | 国产一区视频在线观看 | 精品国产色欧洲激情 | 国内免费无码自拍视频网 | 91在线国产一区二区 | 91精品视频一区 | 国产a一级毛片精品高清乱码 | av无码久久久久久不卡网站 | 国产aⅴ精品一区二区三区久久 | 成年人射精的黄色视频网站 | 国产日韩欧美另类精品色综合 | 国产毛片特黄毛片老人 | av鲁丝一区鲁丝二区 | 国产成人精品自拍 | 国产午夜影院黄色片 | 国产日韩久久久久精品影视 | 91精品国久久久久久无码 | 精品久久久无码中文字幕 | 丰满人妻连续中 | 成人无码在线视频网 | 国产精品白浆无码浪潮av | 99久久精品免费看国产交换 | 国产精品国产三级国产an | 精品国产一区二区三区av性色 | 99久久人妻精品无码二区 | av夜夜躁狠狠躁日日躁 | 国产成人免费在线观看 | 国产欧美成人精品 | 国产精品天干天干 | 国产丝袜美女在线高潮网站 | 国产真实露脸在线观看 | 国产午夜精品一区二区三区极品 | 91精品成人免费国产片 | 国产精品青青青高清在线观看 | 91麻豆精品久久久久蜜臀 | 国产极品粉嫩福利 | 国产精品无码一区二区在线观 | 99久久精品国产国产毛片小说 | 国产萌白酱喷水视频 | 成av人片在线观看无码一 | 国产精品亲子乱子伦 | 精品一级毛片免费无卡顿 | 成人国产一区二区三区久久久 | 国产在线91高清 | 国产av一区二区三区久久久综 | 国产高清视频青青青在线 | 国产绿奴视频在线观看 | 2025国产精品一区二区在线 | 99久久国产综合精品1尤物 | 丰满人妻被公侵犯中文电影版 | 国产人妖性一区二区 | 国产三级在线播放放视频 | 国产麻豆精品久 | 国产精品思思在线 | 国产一级毛片在线。 | 国产成年无码aⅴ片在线韩国 | 国产大学生无码视频在线观看 | 国产精品日韩在线一区 | 国产精品日韩无码大秀视频 | 91精品在线国产 | 国产黄色靠逼视频网站 | 国产999视频在线播放 | 99久久国产综合精 | h无码精品视频在线观看网站 | 国产美女精品视频 | 国产成人a∨激情视频厨房 国产成人a∨麻豆精品 | 成人午夜毛片一区二区 | 精品国产免费一区二区三区香蕉 | 国产自产在线观看 | 国产麻豆媒一区一区二区三区 | 国产精品亚洲999久久久 | 国产美女嘘嘘嘘嘘嘘 | 国产在线播放成人午夜精品 | 国产一区亚洲一区在线观看 | 国精产品一区二区三区公司 | 2025国产麻豆 | 91精品久久久久无码午夜福利 | 国产亚洲综合一区二区三区 | 国产成a人亚洲精v品在线观看 | 国产丝袜美腿高跟白浆 | 国产精品成人黄色片 | 精品无码自拍视频在 | 国产成人精品亚洲日本在线观看 | 国产大片中文字幕在线观看 | 成人欧美一区二区三区 | 福利一区二区三区不卡视频 | 国产真实夫妇交换视频 | 国模大胆无码私拍啪啪av | 91精品国产亚洲爽啪在线观看 | 国产成年无码久久久久毛片 | 成人午夜亚洲精品无码网站 | 国产日本精品在线观看 | av免费一区二区三区试看 | 精品日韩一区二区 | 18精品久久久无码午夜福 | 国产av一区二区三区无码野 | 国产在线高清仑片a | 国产一区二区三区地区 | 成人年无码av片 | 精品无码国产不卡在线观看首 | 成人a影片在线观看 | 国产女主播白浆在线看 | 国产裸舞表演裸体写真一区二区 | 国产精品亚洲色婷婷99久久精品 | 国产精品日韩无码 | 丰满的岳乱妇久久久 | www.夜片内射视频日韩精品成人 | 国产精品国三级国产av视色 | 国产超清综合在线视频 | 国产猛男猛女超爽免费视 | 国产一级无码午夜大片在线观看 | 精品久久全免费的听书软件 | 18禁h免费动漫无码网站 | 国产精品熟女高潮视频 | 91麻豆精品国产高清在线 | 国产午夜精品久久久久婷婷 | 国产一区精品一区无码 | 91在线视频国产 | 国产精品午夜理论片在线播放 | 国产精品专区第一页在线观看 | 国产在线视精品在二区 | 国产另类ts人妖一区二区 | 国产区欧美区一区二区精品区 | 91极品女神私人尤物在线播放 | 91精品国产成人久久久久久 | 国产午夜毛片一区二区三区 | 国产福利91 | 国产精品无码av在线毛片 | 成人午夜精品亚洲日韩 | 成人无码免费午夜福利在线看片 | 精品人妻无码一区二区三区视频 | 国产精品白浆在线播放 | 99久久精品久久久久婷婷 | 国产精品福利久久2025 | 国产午夜精品一区理论片水蜜桃 | 二区三区好的精华液杨超越 | 国产精品成人免费视频99 | 国产无码不卡一区二区三区 | 国产成人无码亚洲a片小苹果 | 高清久久久久久久久 | 国产放荡av剧情演绎麻豆 | 国产末成年女av片一区二区 | 成人欧美精品视频在线观看 | av高清无码在线加勒比天堂 | 国产在线拍揄拍自揄拍无码资源 | 成年站免费网 | 国产午夜亚洲一区二区在线观看 | 国产精品一品二区三区四区 | a级毛片免费全部播放 | 国产精品三级手 | 精品无人区麻豆乱码1区2区 | av片免费免 | av片在线播放 | 国产成人一区二区三区 | 国产精品成人有码在线观看 | 精品一区二区91 | 国产午夜精品久久久久免费视 | 国产精品免费观在线 | av入口在线免费 | 国产精品天干天干在线 | 国产在线观看国偷精品产 | 国产不卡的一区二区三区四区 | 国产女主播精品大秀系列 | 国产午夜亚洲精品三区 | 精品日韩欧美国产一区二区 | 高潮欧美老妇 | 国产成人悠悠影院 | 国产高清晰在线播放 | 国产亚洲欧美在线一区二区 | 国产欧美日韩一区二五月天 | 按摩师玩弄到潮喷 | 国产激情无码一区二区 | 国产精品成人三级 | 国产激情久久久久影院小草 | 国产日韩欧美精品另类一区二区 | 国产一区二区三区五区六区 | 国产美女极度色诱 | 国产在线观看免费无码 | 3d动漫精品一区视频 | 国产一区二区精品在线观看 | 91在线无码精品秘入口导航 | 国产精品v欧美精品 | 精品一区二区三区久久久久网站 | 91在线无码精品秘入口色欲 | 精品无码专区亚洲 | 国产综合第一页在线视频 | 国产成人av男人的天堂 | 国产精品一区二区日韩av在线 | 国产三级高清午夜羞羞视频 | 国产精品另类亚洲精品久久小说 | 福利视频综合一区二区三区四区 | 国产高清无码一区二区久久 | 国产成人愉拍免费视频 | 国产精品无码久久aⅴ裸体 国产精品无码久久av | 高潮添下面视频免费看 | 国产a网站| 国产亚洲欧美日韩在线观看不卡 | 国产尤物亚洲av无码精品色区 | 国产精品无码一本 | 精品国产乱子伦一区二区三区58 | 国产成人亚洲精品96 | 国产精品午夜福利电影 | 国产成人aa在线观看 | 国产成人久久精品二三区无码 | 大尺度啪啪人体午夜 | 国产一区二区三区色噜噜 | 国产日韩精品无码区免费专区国产 | 加勒比一本久久国产精品 | 国产午夜精品一区二区三区极品 | 国产自产视频在线观看香蕉 | 国产aⅴ一区 | 成人午夜亚洲精品在线网站 | 国产高清吃奶成免费视频网站 | 成人午夜免费一区二区 | 91欧洲在线视精品在亚洲 | 国产成人午夜精品免费视频 | 国产一级性爱高清视频 | 成人a级毛片免费观看av网站 | 成人午夜福利视频镇东影视 | 国产亚洲91视频 | 国产成人精品免费久久久久 | 国自产拍亚洲免费视频 | 91午夜精品久久久久精品 | 国产超碰人人做人人爽av | 精品人妻毛片免费视频 | 国产a毛片| 黄色视频一区二区三区四区 | 国产精品亚洲综合网熟女 | 国产成人福利免费视频 | 波多野结衣中文字幕一区二 | 国产va欧美va在线观看 | 国产日韩一区二区三区在线播放 | 91精品福利久久久 | 国产综合久久精品综合v无码 | 国产欧美久久高清 | 国产三级精品三级在线专区91 | 国产成人精品.一二区 | 国产精品亚洲欧美大片在线 | 国产自产免费精品一区 | 国产精品va无码一区二区三区 | 精品国产福利一区二区三区 | 成人日韩高清 | 国产三级在线观看视频不卡 | 国产高清无码在线观看 | 国产av夜夜欢一区二区三区 | 国产无码自拍 | 国产精品白丝a | 91亚洲国产成人久久精品网站 | 精品人妻一区二区三区含羞草 | 国产精品成人av久毛片 | 国产三级在线观看中文 | 国产精品久久久久久亚洲毛片 | 18禁免费无码无遮挡网站 | 国产av寂寞骚妇 | 东京热人妻无码一区二区av | 国产精品日韩2025 | 国产精品爆乳中 | 2025最新国产精品网站 | 国产成人精品综合网站 | 精品91自产拍在线 | 国产亚洲日韩一区二区三区在线观 | 91精品福利麻豆专区 | 国产成人69精品视频竹菊 | 2025国产麻豆剧果冻传媒影视 | 国产成人精品高清在线观 | 国产私拍一区二区三区 | 国产一区二区三区在线 | 国产精品高清一区二区三区人妖 | 91国内精品视频 | 国产后入内射视频 | 国产一区二区三区精品久久呦 | 国产一区二区精品尤物 | 国产精品一二三区日韩免费 | 国产午夜无码片在线观看网站 | 黑色丝袜老师自慰喷水浪潮免费 | 丰满美女冒白浆久久久久久久 | 国产黄色一级网站 | 成人黄色视频在线播放165 | av手机电影在线不卡 | 精品亚洲aⅴ无码一区 | 国产精品欧美亚洲韩国日本不卡 | 成人免费无码毛片黄网 | 国产91精品一区在线观看 | 精品秘无码一区二区三区老师 | 高清无码一区二区在线观看吞精 | 2025国产麻豆剧传媒电影 | 国产精品成人3p一区二区三区 | 69或成本人午夜在线观看视频 | 国产在线观看精品 | 国产91久久精品一区二区 | 丰满爆乳美女在线视 | 国产一二三区在线 | 国产高清在线精品一区app | 国产91精品福利资源在线观看 | 国产美女一级做受在线观看 | 97无码精品人妻一区二区老司机 | 国产精品白浆无码流出免费看 | 国产丝袜精品一区二区在线观看 | 国产精品一区二 | 国产无套露脸在线观看 | 99自偷国偷产品一区电影 | 国产精品视频一区二区三区w | 高清女厕偷拍一区二区三区 | 国产熟妇另类久久久久 | 成人午夜精品久久久久久久网 | 国产精品无码一级毛片app下载 | 2025一区一级视频在线观看 | 精品无码国产社区野花在线观 | 国产精品无码二区二区 | 国产精品日韩变态另类 | 国产成人无码精品午夜福利a | 丰满人妻一区二区三区53视频 | 成人无码aa精品一区 | 国产精品毛片在线完整版的 | 国产精品麻豆成人av电影艾秋 | 精品少妇人妻一区二区黑料社区 | 国产成人无码视频 | 国产成人三级在线观看网址 | 国产自产一区二区三区视频在线 | 精品久久久久久无码一区二区 | 国内精品乱码卡一卡2卡 | 二区二期视网膜病变能好吗? | 精品系列人妻无码 | 高清av一区二区三区在线观看 | 精品人妻少妇嫩草av无 | 成人色视频在线观看 | 国产成人综合免费在线观看 | 91一级特黄大片 | 国产a级毛片免费视频一区二区 | 国产午夜激无码v毛片久久 国产午夜激无码αv毛片久久 | 精品国产高清一区二区三区 | 国产成人无码精品午夜福利a | 国产成人福利免费观看 | 92午夜福利极品少妇久久一区 | 国产午夜福利精品一区二区三区 | 精品亚洲成a人20257在线观看 | 国产在线精品成人一区二区三区 | 国产精品日韩专区第一页 | 91精产国品一二三区在线 | 国产精品午夜免费观看网站 | 精品国产一区二区三区三洲 | 成人午夜无码国产 | 国产精品成人观看视 | 国产91在线播放九色000 | 国产精品亚洲综合看片 | 高清无码性色网站 | 2025国内自拍视频在线播放 | 精品无码av人在线观看国产 | 高清成年美女黄网站免费大全 | 国产偷自一区 | 动漫精品专区一区二区三区不 | 国产人妻人伦精品欧美 | 岛国毛片一级一 | 国产福利91精品一区二区三 | 国产毛a片啊久久久久久按摩 | 国产av成人a一级a毛片 | 国产成人高清精品免费 | 国产综合a级片视频 | 高清不卡亚洲日韩av在线 | 精品无码av一区二区三区 | 国产精品女人高潮毛片 | 国产精品亚洲码精品 | 国产真实喝醉系列39女同事 | 国产尤物精品自在 | 国产在线精品一区一本 | 国产91福利精品免费观看 | 国产成人99精品免费观看 | 成人做受120秒试看试看视频 | 国产97香蕉视频在线看 | 国产69精品久久久久久妇女 | 果冻传媒aⅴ毛片无码蜜桃 果冻传媒app在线播放 | 国产福利在线视频大二 | 国产成人a码男人的天堂 | 国产精品黄色网站一级大片手机 | 国产高清一国产av麻豆网 | 国产a线视频播放 | 精品人妻无码久久久一区二区 | 9191精品国产免费久久电影 | 国产无码av一区二区在线入口 | 69精品人人人人人人人人人 | 东京热无码一区 | 精品无人国产偷自产在线 | 午夜福利理论电影网 | 国产精品免费aⅴ片在线观看 | 激情视频在线观看国产一区 | 国产精品流白浆在线观 | 精品无码国产免费网站视频 | 国产激情无码视频一区二区三区 | 国产精品白浆大屁股一区二区三 | 国产一区二区三区精品久久 | 国产一区二区三区在线播放 | 成人h动漫在线播放本动漫 成人h精品动漫在线 | 精品人妻丝袜av一区二区 | 国产在线永久免费 | 911久久香蕉国产线看观看 | 国产a级一级久久毛片 | 国产av仑乱内谢 | 国产成人麻豆精品午夜福利在 | av人片在线观看不卡 | 国产欧美日韩在线一区二区激情 | 国产精品无码久久sm | 成人一区二区三区av电影 | 国产午夜福利在线视频 | 爆乳熟妇一区二区三区 | 国产午夜在线观看免费 | 高潮抽搐痉挛一区二区精品视频 | 国产麻豆剧传媒精品国产v 国产麻豆剧传媒精品国产v精品 | 91精品无码国产在线观看一区 | 国产日韩久久久久精品影院 | 丰满老熟女一级aa片色欲 | 国产成人啪精品午夜在线观看 | 午夜三级中文在线观看 | 国产白袜脚足j棉袜在线观看 | 成人綜合網亞洲伊人 | 国产中文字幕在线免费观看 | 2025国精产品一二三四区 | 国产精品亚欧美一区二区三区 | 国产精品一区二区在 | 国产精品天干天干在线观看 | 国产无码理论视频 | 3d动漫精品啪啪一区二区中文 | 精品伦一区二区三级视频 | 国产成人av三级在线观看 | 国产无码一区二区三区不卡视频 | 国产视频一区在线播放 | 国产人妻久久精品一区二 | 国产a级作爱片免费看 | 国产毛片精品av一区二区 | 精品一区二区国语对白 | 91青青青国产在观免费影视 | 91免费在线视频观看 | 国产一区二区av写真福利 | 成人国内精品久 | 国产精品午夜自在在线精品 | 精品无码一区在线观看 | 韩国无码中文字幕在线视频 | 国产视频一区二区高清免费 | 国产精品合集久久久久青苹果 | 国产超薄黑色丝袜在线观看 | 国产精品日韩激情无码 | 国偷自产一区二区免费 | 国产美女裸体网站 | 国产高清一国产av麻豆网 | 国产成年人在线观看 | 2025国产麻豆剧传媒网站 | 精品国产免费第一区二区三区日韩 | 国产91精品福利资源在线观看 | 国产美女一区三区在线观看 | 国产一线久 | 国产精品中文字幕亚洲欧美 | 国产美女视频网在久久69 | 丰满大码的熟女在 | 国产丝袜在线视频亚洲 | 国产a一级无| av天堂午夜精品一区二区三区 | 国产女人喷潮视频在线观看 | 国产a级毛片免费视频一区二区 | 成人国产三级视频在线观看 | 国产成人综合亚洲欧美在线 | 国产麻豆精选av精彩内容大揭秘 | 97无码人妻一区二区三区 | 高清日韩国产无码一区二区 | 国产在线精品无码二区二区 | 国产精品日产欧美一区二区三区 | 国产精品嫩草影院入口一二三 | 国产精品秘一区二区三区高潮 | 国产欧美日韩综合一区在线 | 国产欧美日韩在线中文一区 | 国产成人精品免高潮在线观看 | 国产欧美日本亚洲精品五区 | 国产午夜无码精品免费看秒播 | 潮喷失禁大喷水aⅴ无码 | 国产做爰全免费的视频避孕 | 国产精品女人呻吟在线观看 | 国产亚洲欧美在线观看四区 | 国产精品一级毛片无码a片 国产精品一级毛片在线观看 | av色欲无码人妻中文字幕 | 国产精品午夜自在在线精品 | 国产精品免费av片在线观看 | 91大神亚洲影视在线 | 91av视频| 国产一卡二卡3卡四卡免费 国产一卡二卡三卡 | 国产精品一在线观看 | 精品一区二区三区不卡久久久 | 国产无码自拍高清小电影 | 国产精品爆乳奶水无码视频免费 | 国产成人aⅴ片在线 | 国产精品一区欧美日韩制服 | 国产欧美日韩综合一区在线 | 国产精品视频一区二区三区在线观看 | 国内熟妇二区三区在线 | h无码中字动漫在线 | 国产原创一区二区 | av无码一区二区 | 国产精品无码免费播放在线观看 | 成人免费午夜无码视频在线播放 | 18禁无遮拦无码国产在线 | 国产女同一区二区在线观看 | 国产成人精品视频2025 | 国产性短视频在线观看 | 国产精品亚洲综合久久小说 | 国产精品原创巨作av免费 | 成人三级视频观看 | av天天看 | 国产欧美va| 91麻豆精品国产专区在线观看 | 国产一级毛片视频网 | 国产色欲av一区二区三区麻豆 | 91国内精品久久久久免费影院 | 精品无人区乱码一区二区三区手机 | 国产综合久久三级蜜臀导航 | 国产成人精品怡红院在线观看 | 国产日韩精品一区二区三区在线 | 91精品国产免费久久国语蜜臀 | 成人夜色香网站在线观 | 精品亚州毛片在线免费观看 | 不卡午夜中文字幕 | 精品丝袜人妻 | 国产精品成人自产拍在线观看 | 国产精品视频国产永久视频 | 国产精品日韩av在自线在免费 | 国产精品一区二区三区精 | 国产肥熟女视频一区二 | 911av视频 | 国产精品啪啪一区二区三区 | 国产麻豆天美果冻网盘高清资源 | 国产91av视频在线播放 | 国产精品亚洲一区二区在线观看 | 国产成人无码aⅴ片在线观看视频 | 国产喷水大秀在线观看2025 | 91精品国产一区二区三区免费 | 国产精品变态另类虐交 | 成人精品鲁一鲁一区二区 | 国产亚洲视频在线播放无水印 | 91一区二区三区久久国产乱 | 精品无码中出在线精品视频 | 国产高清精品福利私拍国产写真 | 国产亚洲欧美日韩一区图片 | 成人区人妻精品一区二区不卡麻豆 | 国产精品毛片 | 国产成人一区二区三区欧美 | 国产午夜毛片v区一区二区三区 | 国产中文欧美在线视频 | 国产在线精品一区在线观看 | 国产a久久麻豆入口 | 18禁动漫一区二区三区免费下 | 成人国产一区二区三区精品一 | 国内欧美一区一区三区视频 | 精品无码av一区二区三区 | 91精品啪在线观看国产91 | 国产亚洲视频在线播放大全 | 国产精品一区二区日韩91 | 精品日本视频一区二区三区 | 国产激情一区二区三区在线观看 | 成人免费一区二区三区 | 国产午夜精品理论片 | 成人a毛片在线看免费全部播放 | 国产成人精品久久免费动漫 | 国产一区精品在线观看 | 国产免费午夜福利片在线观看 | 国产亚洲色视频在线 | 国产精品无码素人福利 | 国产+欧美日韩+ | a级国产乱理伦片免费观看 a级国产乱理伦片野外 | 国产成人秘在线观看免费网站 | 国产精品一久久香蕉国 | 国产主播av福利精品一区 | 国产精品va在线观看无码电影 | 成年人射精的黄色视频网站 | 国产av高清怡春院ww8 | 国产女主播视频观看网站 | 果冻传媒一区 | 国产白丝护士av在线网站 | 多人强伦姧孕妇在线观看 | 国产高清久久精品一区在线 | av検索データベース | 国产美女高潮抽搐在线播放 | 2025午夜国产精品福利 | 97人人添人人爽一 | 91麻精品国产91久久久 | aⅴ日本亚洲欧洲免费天堂 aⅴ天堂 | 国产午夜精品18久久蜜臀 | 国产人妻精品一区二区三区 | 国产精品国产av片国产 | 国产一区二区三区欧美精品 | 国产专区视频香蕉 | 国产在线一区二区三区视频 | 精品久久精品中文字幕无码 | 99久久婷婷国产 | 国产一区二区三精品久久久无广 | 国产一区在线观看视频网站 | 国产综合精品 | 国产在线拍揄自揄拍无码 | 99在线精品一区二区三区 | 国产精欧美一区二区三区久久久 | 91人妻在线综合 | 国产成人av三级 | 国产精品密播放国产免费看 | av无码a一在 | 国产成人尤物精品一区 | 2025国自产拍精品免费观看 | 国产成人啪精品视频免费网站 | 精品国产品欧美日产在线 | 国产三级精品播放 | 国产一级片内射在线视频播放 | 99久久一区二区三区免费 | 91在线视频播放 | 国产亚洲综合色就色 | 丰满人妻久久中文字幕免费 | 国产办公室紧身裙丝袜av在线 | 福利一区二区三区不卡视频 | 国产白丝jk | 91国产在线视频在线观看^ | 3d新金瓶玥菲无删减完整版 | 国产超碰人人做人人爽av动图 | 国产日韩欧美另类重口在线观看 | 丰满的少妇愉情hd高清果冻传媒 | 国产av无码专区亚洲av人妖 | 91视频国产大片 | 91在线视频播放 | 丰满肥女巨肥bw | 国产av老师黑色丝袜美腿 | 国产粉嫩精品喷潮在线观看 | 国产精品视频一区二区三区经 | 国产精品三级国语在线看 | 国产亚洲精品4区在线观看 国产亚洲精品91 | 国产av一区二区三区四区五 | 国产精品免费观看视频 | 国产夜色精品一区二区 | 2025无码专区人妻系列制服丝袜 | 国产av午夜福利写真电影 | 国产偷伦视频高清完整版 | 精品亚洲成a人片在线观看少妇蜜 | 国产成人精品一区二三区2025 | 国产无码少妇影视 | 国产精品成人一区二区三区视 | 国产精品美女啪啪视频诱惑 | h无码精品3d动漫在线观看 | 极品美女一级毛片 | 国产一级毛片农村寡妇 | 18禁黄网站禁片免费观看国产 | 成人免费在线观看视频 | 精品亚洲国产成v人片传媒 精品亚洲国产成人av不卡 | 成人无码片黄网站a毛片免费 | 国产精品一级毛片 | 丰满少妇人妻久久久久久4 丰满少妇人妻无码专区 | 国产熟女性爱 | 白浆喷潮在线不卡 | 成人小说亚洲一区二区三区 | 国产精品视 | 99久久精品无码一区二区毛 | 国产精品白浆无码流出在线观看 | 国产韩国精品一区二区三区久久 | 国产日韩久久久一区二区三区 | 18禁免费观看网站 | 国内真实刺激对白自 | 91一区二区在线观看精品 | 18禁无遮挡羞羞漫画在线播放 | 国产91影院| 国产精品欧美一区二区三区 | 国产色视频一区二区三区 | 丰满的人妻hd高清 | 国产成人影院一区二区三区在线 | av在线观看狼友永久网站 | 成人深夜视频在线观看 | 国产一区二区四区在线观看 | 911精品国产91久久久久 | 精品无人区乱码一区二区三区手机 | 国产丝袜一区二 | 国产福利片在线观看 | 顶级欧美色妇xxxxx | 国产av寂寞骚妇 | 成人午夜电影免费完整在线看 | 国产三级午夜理伦三级 | 99精品国产热久久婷婷天堂 | 国产高清一级片 | 精品午夜福利在线观看 | 成人国产一区二区三区精品 | 91精品国产成人综合 | 国产盗摄精品一区 | 国产美女作爱全过程免费视频 | 成年女人毛片免费观看不卡 | 国产高清在线精品一区小说 | 国产av天堂无码一区二区三区 | 国产免费午夜福利 | 国产精品日本一区二区在线 | 国产综合激情在线亚洲第一页 | 国产精品无码片在线看 | 国产激情无码免费av | 国产寡妇偷人在线视频 | 国产一区二区三区久久播放器 | 国产美女精品自在线拍免费 | 69精彩对白视频国产 | 韩国和日本电影免费看 | 99久久久无码国产精品6 | 二区av交换| 国产精品成人∨a在线观看 国产精品成人3p一区二区三区 | 国产福利在线观看日本二区三区 | 国产一线久 | 国产一区二区二区 | 国产激情偷乱视频一区二区 | 精品无人区麻豆乱码1区2区新区 | 国产午夜高潮熟女精品视频 | 精品人妻少妇av一区二区三区 | 2025国产大陆天免费看黄色视频 | 国产91精品一区二区麻豆网站 | 2025亚洲中文字 | 国产精品成人影院久久久 | 国产午夜一区二区三区影院 | 国产精品久久 | 99久久人妻无码精品系列 | 国产精品免费aⅴ片在线观 国产精品免费aⅴ片在线观看 | 国产妇女性爽视频免费 | 国产午夜成人免费看片无遮挡 | 成人涩涩屋福利视频 | 国产成人午夜 | 91打桩呻吟喷水高潮白浆欧美 | 国产精品成人无码视频 | 91精品国产无线乱码在线观看 | 国产av无码片毛片一级流奶水 | 韩国久久精品 | 国产高清在线精品二区app | 91精品国产福利在线观看性色 | 国精产品一二二区视频 | 国产不卡视频一区二区三区四区 | 国产免费高清综合视频 | 成人免费观看高清视频a斤 成人免费观看国产高清 | 国产精品国产三级国产an | 精品无码人妻 | 国产精品爆乳在线播放第一人称 | 91情侣在线精品国产 | 国产99久久亚洲综合 | 精品国产一区二区三区色欲 | 精品精品国产自在97香蕉蜜芽 | 国产精品va无码一区二区三区 | 91久久91久久精品麻豆 | 99久久精品无码一区二区毛片 | 2025国产精品自在自线 | 国产午夜精品一区二区亚洲国 | 国产成人无码精品久久久免 | 激情高潮毛片免费视频 | 国产午夜福利小视频 | 国外欧美一区另类中文字幕 | 国产狂喷潮在线观看视频欧美 |