欧美日韩亚-欧美日韩亚州在线-欧美日韩亚洲-欧美日韩亚洲第一区-欧美日韩亚洲二区在线-欧美日韩亚洲高清精品

金喜正规买球

logo Swift編程語言中文教程

文檔金喜正規(guī)買球>>Swift編程語言中文教程>>Swift編程語言中文教程(二十一):Swift協(xié)議

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


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

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

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

協(xié)議的語法

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

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

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

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

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

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

屬性要求

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

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

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

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

在協(xié)議中定義類屬性 (type property)時(shí)使用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屬性。因此其遵循者必須含有一個(gè)名為fullName,類型為String的可讀屬性。

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

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

如下所示,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實(shí)現(xiàn)為可讀的計(jì)算型屬性。它的每一個(gè)實(shí)例都有一個(gè)名為name的必備屬性和一個(gè)名為prefix的可選屬性。 當(dāng)prefix存在時(shí),將prefix插入到name之前來為Starship構(gòu)建fullName。

方法要求

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

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

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

protocol SomeProtocol {
    class func someTypeMethod()
}

protocol RandomNumberGenerator {
    func random() -> Double
}

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

LinearCongruentialGenerator類遵循了RandomNumberGenerator協(xié)議,并提供了一個(gè)叫做線性同余生成器(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)部改變實(shí)例類型的方法稱為突變方法。在值類型(Value Type)(譯者注:特指結(jié)構(gòu)體和枚舉)中的的函數(shù)前綴加上mutating關(guān)鍵字來表示該函數(shù)允許改變?cè)搶?shí)例和其屬性的類型。 這一變換過程在實(shí)例方法(Instance Methods)章節(jié)中有詳細(xì)描述。

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

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

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

protocol Togglable {
    mutating func toggle()
}

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

如下所示,OnOffSwitch枚舉遵循了Togglable協(xié)議,On,Off兩個(gè)成員用于表示當(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é)議本身不實(shí)現(xiàn)任何功能,但你可以將它當(dāng)做類型來使用。

使用場(chǎ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
    }
}

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

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

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

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

如下所示,LinearCongruentialGenerator的實(shí)例作為隨機(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è)計(jì)模式,它允許類或結(jié)構(gòu)體將一些需要它們負(fù)責(zé)的功能交由(委托)給其他的類型。

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

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

下文是兩個(gè)基于骰子游戲的協(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é)議可以在任意含有骰子的游戲中實(shí)現(xiàn),DiceGameDelegate協(xié)議可以用來追蹤DiceGame的游戲過程。

如下所示,SnakesAndLadders是Snakes and Ladders(譯者注:控制流章節(jié)有該游戲的詳細(xì)介紹)游戲的新版本。新版本使用Dice作為骰子,并且實(shí)現(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)實(shí)現(xiàn)。所有的游戲邏輯被轉(zhuǎn)移到了play方法中。

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

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

因?yàn)閐elegate是一個(gè)遵循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實(shí)現(xiàn)了DiceGameDelegate協(xié)議的方法要求,用來記錄游戲已經(jīng)進(jìn)行的輪數(shù)。 當(dāng)游戲開始時(shí),numberOfTurns屬性被賦值為0;在每新一輪中遞加;游戲結(jié)束后,輸出打印游戲的總輪數(shù)。

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

DiceGameTracker的運(yùn)行情況,如下所示:

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é)議等成員。詳情請(qǐng)?jiān)?a target="_blank">擴(kuò)展章節(jié)中查看。

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

TextRepresentable協(xié)議含有一個(gè)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類型的實(shí)例可被當(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)一個(gè)類型已經(jīng)實(shí)現(xiàn)了協(xié)議中的所有要求,卻沒有聲明時(shí),可以通過擴(kuò)展來補(bǔ)充協(xié)議聲明:

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

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

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

注意: 即時(shí)滿足了協(xié)議的所有要求,類型也不會(huì)自動(dòng)轉(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é)議能夠繼承一到多個(gè)其他協(xié)議。語法與類的繼承相似,多個(gè)協(xié)議間用逗號(hào),分隔

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

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

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

遵循``PrettyTextRepresentable協(xié)議的同時(shí),也需要遵循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ù)組中的每一個(gè)元素:

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

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

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

協(xié)議合成

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

舉個(gè)例子:

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)體遵循了這兩個(gè)協(xié)議。

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

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

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

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

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

注意: @objc用來表示協(xié)議是可選的,也可以用來表示暴露給Objective-C的代碼,此外,@objc型協(xié)議只對(duì)類有效,因此只能在類中檢查協(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寫為計(jì)算型屬性(computed property),后者則把a(bǔ)rea寫為存儲(chǔ)型屬性(stored property)。

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

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

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

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

如下所示,在迭代時(shí)檢查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é)議時(shí),通過as?操作符將其可選綁定(optional binding)到objectWithArea常量上。

objects數(shù)組中元素的類型并不會(huì)因?yàn)橄蛳罗D(zhuǎn)型而改變,當(dāng)它們被賦值給objectWithArea時(shí)只被視為HasArea類型,因此只有area屬性能夠被訪問。

可選協(xié)議要求

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

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

像someOptionalMethod?(someArgument)一樣,你可以在可選方法名稱后加上?來檢查該方法是否被實(shí)現(xiàn)??蛇x方法和可選屬性都會(huì)返回一個(gè)可選值(optional value),當(dāng)其不可訪問時(shí),?之后語句不會(huì)執(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中的屬性和方法都是可選的,因此可以在類中聲明但不實(shí)現(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屬性用于存儲(chǔ)當(dāng)前的值,increment方法用來為count賦值。

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

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

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

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

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

class ThreeSource: CounterDataSource {
    let fixedIncrement = 3
}

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

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

TowardsZeroSource實(shí)現(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
国产人成网在 | 国产乱子伦 | 在线观看精品国产 | 日日摸夜夜 | 国女精品爽爽一区二区 | 精品免费视频大 | 日本永久免费aⅴ在线观看 噼里啪啦hd免费观看动漫 | 国语国产自产精品 | 美国精品亚| 国产精品露脸国语对白99 | 国产日韩欧美高清一区二区三区 | 国产又猛又黄又爽在线视频无 | 亚洲男人的天堂在线va拉文 | 床震吃胸膜奶免费视频 | 欧美性爱在 | 在线观看免费人成视频国产 | 亚洲欧美日本国产专区一区 | 免费精品国产自产拍观看 | 爱视频在线观看 | 亚洲二区在线 | 99视频精品全部国产盗摄 | 国产免费一区二区三区在线看 | 精品91自产拍在线观看 | 国产乱子伦一区二区三区 | 免费国产91欧美va一区二区 | 爽爽狠狠婷婷97 | 国产精品勾引上司在线播放 | 中文字幕乱码亚洲中文在线 | 99精品热爱在线观看视频 | 国产视频短 | 91高清在线 | 无限资源最| 最新日韩午夜一区二区 | 国产91剧情在线观看 | 国产一区二区三区不卡在线观看 | 中文字幕在线日亚州9 | 国产精品碰碰现在自在拍 | 精品偷拍视频一区二区三区 | 亚洲成aⅴ人片久青草影院 国产91精品系列在线观看 | 国产啪视频免费观看视频 | 中文字幕第1页精品一区 | 日韩国产欧美精品综合二区 | 国产乱码一区二区三 | 国产国产人免费人成免费视频 | 成+人+亚洲+综合天堂 | 91视频免费下载 | 亚洲欧美综合另类 | 欧美亚洲国| 亚洲国产精品自在拍在线播放蜜臀 | 一区二区国产高清视频在线 | 天堂中文最新版在线中文 | 中文字幕免费播放 | 国产精品高清在线观看93 | 网站视频福利 | 91极品美| 日皮视频免费观看 | 亚洲色大成网站www永久网站 | 亚洲人成在线观看网站播放 | 亚洲精品手机在线 | 亚洲开心婷婷中文字幕一区 | 人妖ts国产手机在线 | 亚洲欧洲日韩一区二区日本 | 国产女与黑 | 又粗又黄又猛又爽大片免费 | 国产91茄子在线播放 | 国产极品精品免费视频能看 | 国产在线播精品第三 | 婷婷亚洲久悠悠色在线播放 | 国产精品亚洲自在线播放页码 | 777视频网| 新不夜城综合另类 | 日韩高清专区 | 国产福利小视 | 欧美videos另类极品 | 香蕉国产亚洲精品va在线观 | 成人拍拍拍在线观看 | 一区二区三区四区在线播放视频 | 九月丁香婷婷激情四射视频一区 | 中文字幕日韩精品第一页 | 日本一区二区三区四区视频 | 国产精品盗摄一区二区在线 | 日本欧美一区二区三区在线播放 | 欧美精品国产日韩综合在线 | 亚洲综合一区国产精品 | 国产在线欧美日韩一区二区 | 夜夜狂射影院欧美极品 | 99欧美午夜一区二区福利 | 三级网站 | 日韩精品永久免费播放平台 | 手机在线| 最近播放中文版在线观看免费 | 精品三级视频在线观看 | 日本精品一区在线观看 | 国内揄拍国 | 午夜美女视频在线 | 国产精品自在线免费 | 亚洲精品国产一级高清在线观看 | 三级乱伦国产欧美 | 不用下载播放器的电影网 | 日本韩国亚洲综合日韩欧美国产 | 国产精品成年片在线观看 | 白丝视频 | 免费看美女脱了全身衣服直播 | 在线观看视频一区精 | 国产精品6 | 在线观看最新国产专区 | 国产在线一区二区三区欧美 | 婷婷中文视频在线 | bt自拍另类综合欧美 | 成人美女国产精品免费视 | 日韩新片在线观看网 | 日韩欧美亚洲一区二区在线观看 | 精品国产蜜桃 | 国产经典aⅴ三级观看 | 欧美日韩一区二区在线观看视频 | 日韩在线视频在线观看 | 亚洲欧洲日韩国产aa色大片 | 成年女人免费碰碰视频 | 黑人免费 | 国产亚洲欧美一区二区精 | 久99视频精品免费观看福利 | 亚洲一级二级三级四级 | 91丝袜精品诱惑在线观看 | 亚洲国产精品第一区 | 91精品国产闺蜜国产在线闺 | 国产一区二区三区在线播放 | 青青国产在线观看 | 精品不卡一区二区 | 欧美高清性色生活片免费观看 | 2025中文字幕日 | 一区二区视频 | 日本一本之道之视频在线不卡 | 经典偷窥 | 动漫免费在 | 中文字幕一区日韩高清 | 欧美综合自拍亚洲综合区 | 亚洲人成网站观看在线播放 | 色哟哟网站入口在线观看视频 | 亚州国产高清在线一 | 区不卡无毒影院 | 国产伦精品一区二区三区视频 | 国产足控脚交在线观看 | 大陆国语自产精品视频在 | 九九热线有精品视频 | 亚洲国产精品欧美日韩一区二区 | 不要播放器看在线播放a国产 | 日本中文字幕一区二区视频 | 三级理论电影三级午夜电影院 | 日本黄页网址在线 | 欧美日韩国产色综合一二三四 | 欧美大片欧美激情性色a∨在线 | 精品+在线+国产手机 | 中文字幕在线看片 | 国产热re9| 国产91丝袜在线播放0 | 欧美日韩一区二区在线 | 91福利电影 | 制服丝袜中文字幕在线观看 | 免费日本国 | 国产精品1卡2卡3卡4卡 | 2025最新国产在线看 | 17p密泬18p| 日本国产高清在线观看 | 亚洲日本在线在线看片4k超清 | 日韩精品制服诱惑中文字幕 | 日韩中文字幕在线播放 | 一本色道 | 亚洲欧美日韩国产精品一区第一页 | 欧美日韩一区二区成人午夜电影 | 一区二区自拍 | 草草线禁成18年在线视频 | 欧美日韩亚洲国内一区二区三区 | 男女爽爽午夜18 | 91精品啪在线观看国产91 | 黄骗在线免费观看 | 中文字幕精品亚洲无线码一区 | 免费99精品国产自在现线 | 国产乱码一区二区三 | 中文字幕日韩高清 | 片专区成人 | 成人欧美| 成人a网站 | 日本高清乱理伦片中文字幕 | 天堂а√在线中文在线 | 99久re热视频这里只 | 亚洲步兵欧美精 | 国产特黄特色一级特色大片 | 欧美又粗又大又长又硬一级a | 欧美a级情欲片手机在线播放 | 在线欧美日韩成人 | 精品国产柚木在线 | 日韩亚洲欧美三区中文字幕 | 免费国产小视频 | 精品成免费视频9 | 在线视频播放 | 午夜三级福利在线观看 | 污软件不收费软 | 国产伦精品一区二区三区视频网站 | 亚洲成?v人片在线观看翻墙网站 | 息与子猛烈交尾在线播放 | 国产精品初高中精品免费观看 | 国产欧美日韩一区二区三区视频 | 小小的日本高清在 | 久热在线精品视频观看 | 婷婷六月综合缴情在线小蛇 | 国产精品一区二区国产馆蜜桃 | 亚洲欧美中文日韩v在线观看 | 91蜜桃| 国产精品网站不卡在线观看 | 视频在线观看jjxyz | 香港三级日本三级人妇三99 | 99在线精品 | 国产午夜福利在线永久视频 | 亚洲欧美综合网站 | 日韩精品在线视频 | 国产乱色国产精品免费视频 | 国内精品日本和韩国免费不卡 | 日韩欧美另类一区二区三区 | 二区三区视频精品 | 综合在线观看高清自拍 | 色色一区二区 | 欧美午夜性刺激在线观看免费 | 重口sm一区二区三 | a在线视频播放观看免费观看 | 国精一二二产品无人区 | 成人高清 | 神马影院手机在线观看 | 91精品啪国产在线观看免费牛牛 | 亚洲精品高清中文字幕完整版 | 日本女优中文字幕 | 中文字幕有码在线观看 | 国产视觉| 成人免费看片又大又黄 | 国产精品果冻传媒在线 | 国内精品视频在线中文字幕 | 91色窝窝国产蝌蚪在线观看 | 最新国产福利在线观看精品 | 午夜成人影院网站18进 | 免费观看视频成人国产 | 99热日韩 | 亚洲无线观看国产高 | 丝袜美腿中文字幕 | 精品日本一区 | 亚洲色成人中文字幕网站 | 国产片人综合亚洲区 | 91秒拍国产福利在线观看 | 欧美日韩亚洲国产一 | 99九九精品国产高清自在线 | 亚洲欧美日本a∨在 | 91精品人成在线观看 | 永久免费观看 | 日韩四色在线视频观看网站 | 国产盗摄电影区9876色 | 国产福利在线永久视频 | 亚洲欧美日韩一区在线观看 | 电视剧免费在线 | 亚洲三级香港 | 依依成人影院在线观看 | 小说区亚洲综合第1页 | 亚洲国产一区在线观看 | 欧美精品一区二区三区 | 欧美日韩国产综合视频在线看 | 天天爱天天做天天做天天吃中 | 999zyz玖| 国产欧美日本亚洲精品一4区 | 2025亚洲国产成a在线 | 午夜视频免费观看 | 欧美日韩国产在线激情 | 日韩在线观看视频 | 亚洲精品456人成在线 | 正在播放国产多p交换视频 日韩成全视频观看免费观看高清 | 亚洲美女影院 | 设看到很多欧美日韩一区二区综 | 天天澡日日澡狠狠欧美老妇 | 亚洲人成网 | 三级在线观看免费观看电影 | 亚洲国产欧美在线一区二区 | www日韩中文字幕在线看 | 免费aⅴ网站 | 野花精品 | 日本搞黄 | 91网首页| 日韩欧美在线观看视频 | 91制片厂职场冰与火 | 国产在线精品一区二区不卡 | 午夜男女爽爽爽免费播放 | 欧美日韩国产区在线观看 | 日本不卡在线免费 | 国产精品日韩激情在线观看 | 人成视频播放 | 亚洲熟女午夜福利 | 国产精品国语对白露脸在线播放 | 国产黄在线观看免费观看网站不卡 | 国产高清在线视频伊甸园 | 成人污污国产在线观看 | 亚洲欧洲国产码专区在线观看 | 亚洲欧洲精品国产二码 | 在线免费观看 | 欧美va亚洲va在线 | 国产a级三级三区成人国产一级婬 | 国产偷国产偷亚洲高清人 | 亚洲欧洲自拍拍偷午夜色 | 99精品综合 | 韩精品欧美综合区 | 在线观看精品国产 | 国产女主播午夜福利在线观看 | 国产又色又爽又黄刺激的影视 | 高清一区二区三区日本久 | 亚洲精品国产第一区第二区国 | 国精产品一区一区三区mba下载 | 日本中文字幕在线播放 | 最好看的中文2025 | 成人免费视频在线观看 | 试看试看视频 | 亚洲成a人片在线v | 国产欧美曰韩一区二区三区 | 国产一区高清在线欧美 | 香港三级理论在 | 国产网站免费精品网站 | 性感美女网站一区二区三 | 欧美性大战xxxx | 亚洲清纯自偷自拍另类专区 | 中文字幕一冢本 | 欧美日韩国产综合视频 | 日韩综合在线欧美中文字幕 | 野花论坛社区 | 手机看电影的网站 | 中文亚洲成a人片在线播放 人成视频在线观看国产 | 亚洲专区欧美专区 | 日本在线观看免费高清 | 亚洲国产欧美精 | 免费一级中文字 | 国产老女露脸二区 | 婷婷激情五月天四房 | 91丝袜诱惑一 | 欧美日韩视频在线观看第一区 | 欧美在线激情视频 | 免费国产黄频在线观看视频 | 暴雨入室侵犯进出肉体免费观看 | 国产欧美一区二区三区综合野 | 亚洲国产精品特色大片观看完整版 | 精品国产品国语在线不卡 | 国产92刮伦脏话对 | 乱子伦视频一区二区三区 | 成人免费看片又大又黄 | 日本一级a大片在线观 | 国内精品免费久 | 国产黄a三级三级三级看三级 | 日日噜噜 | 99热这里都是国产精品 | 高清一区二区三区 | 色综合激情丁香七月色综合 | 国产不卡一区二区三区免费视频 | 中文有码视频在 | 设看到很多欧美日韩一区二区综 | 精品中文字幕 | 国产午夜理论不卡在线观看 | 日产精品一线二线三线芒果 | 悠久影视网网 | 国产全肉乱妇杂乱视频 | 99精品成人高清在线观看 | 99视频精品在线 | 91青青青 | 国产丶欧美丶日本不卡 | 九九91精品国产 | 国产国产裸模裸模私拍视频 | 国产99久9在线视频 欧美日韩国产综合视频 | 欧美日韩一区二区综合在线 | 国产桃色在线成免费视频 | 欧美特黄特刺激a一级淫片 日本中文字幕在线播放 | 国产日韩精品 | 一区二区三区不卡 | 欧洲激情网 | 国产精品自产拍在线观看中文 | 免费视频人 | 国产在线观看青草视频 | 免费一级欧美片在线观看欧美 | 国产精品自产拍在 | 国产又爽又 | 天美麻花星空免费 | 91视频在线 | 免费国产午夜激情片 | 男人tv天堂精品一区二区 | 国产女主播午夜福利在线观看 | 欧美国产日韩一区二区 | 五月综合激情国产 | 国产区精品视频 | 91香蕉国产观看免费人人 | 国产精品自在自线国产午夜 | 亚洲国产欧美在线人网站 | 国产精品污www在线观看 | 秋霞人成在线观看免费视频 | 欧美一性一乱一交一视频 | 精品国产自在现线免费观看 | 日本顶级rapper潮水老狼 | 成品网站w灬 | 伦理片午夜视频在线观看免费 | 欧美精品第三页 | 日韩精品中文字幕视频在 | 99精品国产高清一区 | 老女人精品视 | 国产精品一区二区含羞草 | 日本欧美一区二区三区在线观看 | 日本中文字幕在线观看 | 电影排行榜 | 精品国产黑色丝袜高跟鞋 | 亚洲另内精品 | 欧美一区二区不卡高 | 欧美级韩国三级日本三级 | 视频一区二区亚洲欧美 | 日本伊人色综合网 | 久青青视频在线观看久 | 欧洲不卡二卡三卡四卡免费 | 亚洲囯产一区二区三区 | 国产精品自产拍在线观看网站 | 亚洲综合色区在线观看 | 中文字幕精品亚洲一区 | 日韩高清在线日韩视一区 | 国产精品女丝袜白丝袜美腿 | 亚洲国产一区二区在线免费 | 欧美高清免费一 | 水蜜桃国产在线观看免费视频 | 欧美一级做a爱高清免费观看 | 亚洲五月花在线观看 | 国产精成人品日日拍夜夜免费 | 手机国产乱子伦精品视频 | 五月婷婷深爱 | 午夜三级a三级三点 | 国内一区二区三区在线观看 | 午夜亚洲| 欧美综合自拍亚洲综合图区 | 最近免费中文字幕大全免费版视频 | 国产精品成人免费福利 | 偷国内自拍视频在线观看 | 免费一级国产大片 | 女女同性一 | 欧美a∨在线观看 | 欧美交a欧美精品喷水 | 污污网站免费 | 男女午夜视频在线观 | 91网站在线播放 | 美女自卫慰出水免费视频 | 国产亚洲欧美丝袜 | 97porm国内自拍视频 | 精品国产一区二区三区免费91 | 欧美激情视频在线播放全球共享 | 女人喷液在线观看免费 | 精品蜜桃秘?一区二区三区 成人年鲁鲁在线观 | 国产成年女人特黄特色大片免 | 首播电影网 | 欧美日韩国产在线激情 | 国产精品第44页 | 国产手机自拍视频 | 超级媚药痉 | 欧美在线免费观看 | 国产又粗又长又黄又猛又爽视 | 色吊丝*性观看网站大全 | 免费中文字幕不卡 | 亚洲午夜国产精品无卡 | 高清一区二区三区欧美激情 | 亚洲午夜在线x88∨ 亚洲精品国偷自产在线 | 欧美又粗又大又长又硬一级a | 国产精品自在线拍国产第一页 | 深夜爽爽动态图无遮无挡 | 48国产| 凌晨三点在线观看 | 精品外国呦系列在线观看 | 亚洲视频福利 | 国产精品自拍激情性爱 | 国产第一福利136视频导航 | 黑人大战亚洲女在线播放 | 拍国内精品老妇 | 亚洲精品影院一区二区 | 偷妇激情www色色五月丁香婷 | 最近更新中文字幕在线 | 成+人+黄+色+免费观看 | 男人插女人下面的视频 | 日本一道 | 亚洲国产欧美日韩 | 欧美日韩第一页中文字幕 | 亚洲国产综合 | 又粗又黄又猛又爽大片免费 | 少女韩国在线观看完整版免费 | 国产愉拍99线观看 | 国产精品高清一区二区三区不卡 | 日本va在线视频播放 | 一边亲着一面膜下奶53分钟 | 日韩欧美国产中文综合 | 日韩一级在线精品国产 | 日本vs亚洲vs韩国一区三区 | 中文精品视 | 豆国产97在线 | 国产免费一级视频在线 | 99视频在线观看精品29 | 国产不卡高清在线观看视频 | 2025国产手机在线精品 | 小蜜被两老头 | 国产精品自拍视频 | 亚洲日韩穿丝袜在线推荐 | 国内精品视频在线播放一区 | 色与欲影视天天影视 | 成年男人午夜片免费观看 | 欧美日韩免费专区在线 | 亚洲第一精品电影网 | 精品成人大胸美女视频在线播放 | 亚洲精品免费视频观看 | 日本三级在线播放线观看免 | 国产免费人成视频网站在线看 | 91精品国产福利尤物免费 | 99久视频只有精品2025 | 国产免费a级特黄的片子 | 欧美日韩国产日韩 | 日韩电影网 | 欧美怡红院免费全部视频 | 92午夜福利影院一区二区三 | 午夜福利在| 老牛影视网 | 亚洲欧美成α人在线观看 | 日韩欧美中文字幕一区二区三区 | 加勒比精品| 99热这里只有精品23 | 日美妇视频一区 | 女厕脱裤撒尿大全视频 | 日韩欧美一卡二区 | 欧美激情观看一区 | 一级国产| 欧美一级成在线人 | 国产亚洲午夜高清国产拍精品 | 日韩精品三级一区二区 | 国产在线精品国自产拍影院同性 | 国产日韩精品 | 色五月播五月开心五月激 | 国产人在线成免费视频 | 色五月激情五月综合网五月天 | 欧洲亚洲国产日韩综合一区 | 91国内揄拍国内精品情侣对白 | 2025最新在线观影网站 | 黄三级高清在线播放 | 在线成人免费视频 | 99re视频在线 | 免费国产va在线观看中文字 | 深夜影院 | 好男人好资源神马在线 | 一区二区三区影院 | 国产在线精品一区免费香蕉 | 国产高清自偷自 | 日韩一区二区在线观看 | 91精品国产亚一区二区三区 | 91网首页 | 欧美在线一区二区三区欧美 | 成人午夜无人区一区二区 | 2025极品精品国产 | 国产乱子伦精品免费视频 | 中文字幕亚洲第一 | 黄三级在线观看 | 8888四色奇米在线观看 | 国产区精品自拍 | 国产精品午夜福利免费老师 | 中文字幕午夜福利片亚洲 | 人人看人人拍国产精品 | 99国产一区二区三区亚洲一区 | 最近的2025中文 | 一级免费视频在线观看 | 欧美日本片一区二区 | 精品视频一区二区三区四区戚 | 亚瑟视频在线观看 | 精品含羞草免费视频观看 | 亚洲国产天堂久 | 精品亚洲成a人片在线观看 愉拍自拍一区首页 | 欧美日韩国产一区二区三区在线 | 国自产精品手机在线观看视频 | 在线观看高清无 | a级粗大硬长爽猛视频免费 视频二区日韩 | 国产精品系列专区 | 国产精品天干天干在线综合 | 国产91专区 | 亚洲国产欧美日韩一区 | 日韩专区在线观看 | 色眯眯国产在线播 | 制服丝袜中文字幕在线观看 | 最新中文字幕在线观 | 国产久免费在线观看 | 国产户外露出在线观看 | 精品福利一区二区三区免费视频 | 国产3级在线观看 | 男人扒开女人腿桶到爽免费 | 精品欧美日韩一区二区三区 | 国产精彩对白在线91 | 亚洲已满18点击进入在线观看 | 国产又粗又 | 一区二区三区免费在线观看 | 五月桃花网婷婷亚洲综合 | 亚洲一区二区三区高清在线播放 | 国产精品午夜爽爽爽免费 | 性欧美xxxxⅹoooo3d画 | 欧美激情αv一区二区三区 国语在线看免 | 热99这里 | 日韩大片在线永久免费观看网站 | 中文文字幕视频在线观看 | 44极品视频在 | 香蕉亚洲精品网站国产一二三四 | 国产精品福利短视在线播放频 | 免费人成在线观看视频播放 | 欧美一区二区不卡视频 | 精品推荐 | 日本岛国在线观看网址 | 国产黄在线观看免费观看网站不卡 | 日本中文字幕乱码免费 | 欧美一区二区不卡视频 | 亚洲欧美人成综合导航 | 激情文学小说区另 | 国产一区中文字幕 | 激情综合在线观看 | 亚洲欧美另类天天更新影院 | 天天综合 | 无毒不卡 | 亚洲国产国语自产精品 | 欧美级韩国三级日本三级 | 91天仙tv国产福利精品 | a级全黄试看30分钟国产 | 国产做a∨在线视频 | 一级特黄性色生活片一区二区 | 免费人成年短视频免费网站 | 日韩综合精品一区二区 | 综合乱伦自拍影视 | 男人本色国产在线综合 | 亚洲小说区图片区另类春色 | 欧美a√在线免费观看 | 在线观看亚洲 | 三年片在线观看大全中国 | 第一影院 | 亚洲天堂一区二区三区 | 99在线精品免费 | 亚洲欧洲日产国码农村 | 一级午夜福利 | 亚洲老熟 | 国产在线观看一区二区三区四区 | 免费国产小视频 | 天堂在线8一区二区三区 | 大陆国语自产精品视频在 | 国产尤物在线视精品亚洲 | 777国产偷窥盗摄精品原味 | 日本免费人成视频在线观看 | 中文无字幕一 | 国内精品久 | 区小说区激情区图片区 | 国产精品丝袜一区二区三区 | 乱码午夜 | 精品一线二线三 | 视频一区视频二区日韩专区 | 日韩欧美一区二区三区综学生 | 福利片免费视频在线观看 | 善良的老师中文字 | 三极网站| 91精品国自产在线观看 | 国产精品宾馆在线精品酒店 | 三区四区五区高 | 精品国产乱码一区二区三区 | 亚洲欧美精品综合中文字幕 | 国产美女自卫慰水免费视频 | 十分钟在线观看免费直播 | 欧美a级大片 | 国产精品一区二区日韩91 | 国产盗摄精品一区二区三区 | 午夜一区二区三区 | 欧美精品午夜一二三区 | 片视频免费观看 | 中文日产 | 欧美日韩精美视频在线观看 | 亚洲区小说区图片区qvod | 一本一道日韩一二三四区免费 | 九九99靖品| 国产一级一片免费播放放a 91香蕉成人app | 免费va国产高清大片在线 | 综合网在线 | 国产精品边做奶 | 国产视频中文字幕手机版 | 亚洲已满18点击进入在线观看 | 最近中文字幕在线中文高清版 | 色偷偷国色天香在线观看免费视频 | 亚洲中文字幕乱码熟女在线 | 国产欧美日韩综合精品二区 | 日本高清中文字幕在线观穿线视频 | 一出一进一爽一粗一大视频免 | 91干逼| 午夜福利精品在线播放 | 偷国内自拍视频在线观看 | 国产一区二区丝袜美腿在线 | 亚洲成a人片在线观看天堂无 | 人人天天综合影院 | 亚洲国产综合人成综合网站 | 欧美视频在线视频精品 | 91九色老熟女免费 | 2025国产精品国产精华 | 日本一区二区三区视频在线 | 精品一区二区免费vr | 精品综合国产一区二区三区码码 | 免费不卡影院 | 情趣五月天 | 国产午夜亚洲精品不卡免下载 | 姑娘色综合一二三区 | 亚洲一区二区三区精品动漫 | 国产精品三三级在线 | 国产萌白酱喷水在线播放尤物 | 日韩高清一 | 国产日韩欧美高清一区二区三区 | 欧美综合视频在线观看 | 国产精品v日韩精品 | 午夜区一区二区在线观看 | 视频在线华人精品草 | 亚洲熟女一区二区三区 | 亚洲第一视频在线播放 | 日韩在线一区二区视频中文字幕 | 亚洲男人的天堂一区二区 | 国产第二区 | 免费电视剧 | 亚洲日本在线播放视频 | 欧美日韩不卡高清在线看 | 太粗太硬小寡妇受不了 | 宅男66lu国产在线观看 | 国产玉足sm足控脚交视频 | 日本三级网址 | 国产亚洲精aa在线观看香蕉 | 亚洲日本va在线视频观看 | 日韩欧美一区二区不卡看片 | 亚州成人高清国产a | 日韩亚洲人成在线综合日本 | 国产精品亚洲午夜一区二区三区 | 日本一二三区视频在线 | 欧美性受xxxx黑人xyx性爽 | 国产中文另类二区 | 国产精品日韩精品在线 | 国产一区二区网站 | 秋霞电影亚洲一区二区三区 | 欧美亚洲国产一区二区 | 中文字幕日韩精品一区二区三区 | 国产伦精品一区二区三区免.费 | 激情97综合亚洲 | 中文在线日韩 | 亚州国产高清在线一 | 中文字字幕乱码高清二本道资源站 | 精品二区三区三级日韩人妖 | 国产精品6| 亚洲精品国产高清在线观看 | 日韩亚洲人成影院 | 伊人色综合 | 日本亚洲一区二区 | 日本免费人成视频播放 | 午夜国产福利看片 | 国产在线一区二区三区四区居文沛 | 国产精品系 | 国产一区二区三区四区五区 | 中文亚洲成a人片在线播放 人成视频在线观看国产 | 国产视频网站在线 | 免费视频精品一区二区三区 | 国产午夜免费一区二区三区 | 女人18毛| 亚洲视频精品在线观看 | 亚洲精品中文字幕视频网站 | 亚洲影视久| 成人欧美在线观看 | 日韩熟女高清精品专区 | 96国产xxxx免费视频 | 女同恋性一区二区三区四区 | 字幕a∨ | 精品一区二区三区电影 | 日韩在线精品成人v在线 | 欧美亚洲一区二区三区导航 | 国产视频欧美综合 | 激性欧美在线播激性欧美 | 姝姝窝人体ww| 欧美丰满妇大ass | 日本精品一区二区三区在线 | 成人欧美一区二区三区在线观看 | 国内精品91最新在线观看 | а√天堂中文官网在线8 | 欧美日韩免费精品一区二区在线 | 内地级a艳片高清免费播放 五月社区免费 | 极品尤物一区二区三 | 日本午夜专区一 | 免费人成在线观看网站品爱网 | 51精品免费视频国 | 欧美在线观看精品国产 | 福利片午夜免费观着 | 国产专区一区 | 最新69成人国产精品视频免费 | 成人午夜福利短视频在线观 | 国产女主播精 | 免费人成视频在线观看播放网站 | 国产在线观看美女福利精 | 永久精品电影在线观看 | 日韩在线a视频免费播放 | 欧美日韩一区二区在线观看视频 | 精品国产日韩无影视 | 成人污污污www网站免费丝瓜 | 亚洲无人区码卡二卡三卡四卡 | 亚洲欧美日韩看片 | 在线精品91青草国产在线观看 | 日本韩国亚洲综合日韩欧美国产 |