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

首頁 > 編程 > Swift > 正文

Swift教程之屬性詳解

2020-03-09 17:51:09
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Swift教程之屬性詳解,屬性是描述特定類、結(jié)構(gòu)或者枚舉的值,計算屬性存在于類、結(jié)構(gòu)與枚舉中,存儲屬性僅僅只在類與結(jié)構(gòu)中,需要的朋友可以參考下
 

屬性是描述特定類、結(jié)構(gòu)或者枚舉的值。存儲屬性作為實例的一部分存儲常量與變量的值,而計算屬性計算他們的值(不只是存儲)。計算屬性存在于類、結(jié)構(gòu)與枚舉中。存儲屬性僅僅只在類與結(jié)構(gòu)中。

屬性通常與特定類型實例聯(lián)系在一起。但屬性也可以與類型本身聯(lián)系在一起,這樣的屬性稱之為類型屬性。

另外,可以定義屬性觀察者來處理屬性值發(fā)生改變的情況,這樣你就可以對用戶操作做出反應(yīng)。屬性觀察者可以被加在自己定義的存儲屬性之上,也可以在從父類繼承的子類屬性之上。

1、存儲屬性

最簡單的情形,作為特定類或結(jié)構(gòu)實例的一部分,存儲屬性存儲著常量或者變量的值。存儲屬性可分為變量存儲屬性(關(guān)鍵字var描述)和常量存儲屬性(關(guān)鍵字let描述)。

當(dāng)定義存儲屬性時,你可以提供一個默認(rèn)值,這些在“默認(rèn)屬性值”描述。在初始化過程中你也可以設(shè)置或改變存儲屬性的初值。這個準(zhǔn)則對常量存儲屬性也同樣適用(在“初始化過程中改變常量屬性”描述)

下面的例子定義了一個叫FixedLengthRange的結(jié)構(gòu),它描述了一個一定范圍內(nèi)的整數(shù)值,當(dāng)創(chuàng)建這個結(jié)構(gòu)時,范圍長度是不可以被改變的:

復(fù)制代碼代碼如下:

struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// the range represents integer values 0, 1, and 2
rangeOfThreeItems.firstValue = 6
// the range now represents integer values 6, 7, and 8

 

FixedLengthRange的實例包含一個名為firstValue的變量存儲屬性和名為length的常量存儲屬性。以上的例子中,當(dāng)范圍確定,length被初始化之后它的值是不可以被改變的

常量結(jié)構(gòu)實例的存儲屬性
如果你創(chuàng)建一個結(jié)構(gòu)實例,并將其賦給一個常量,這個實例中的屬性將不可以被改變,即使他們被聲明為變量屬性

 

復(fù)制代碼代碼如下:
 
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// this range represents integer values 0, 1, 2, and 3
rangeOfFourItems.firstValue = 6
// this will report an error, even thought firstValue is a variable property

 

因為rangeOfFourItems是一個常量(let),即便firstValue是一個變量屬性,它的值也是不可以被改變的

這樣的特性是因為結(jié)構(gòu)是值類型。當(dāng)一個值類型實例作為常量而存在,它的所有屬性也作為常量而存在。

而這個特性對類并不適用,因為類是引用類型。如果你將引用類型的實例賦值給常量,依然能夠改變實例的變量屬性。

Lazy Stored Properties(懶惰存儲屬性?)

懶惰存儲屬性是當(dāng)它第一次被使用時才進行初值計算。通過在屬性聲明前加上@lazy來標(biāo)識一個懶惰存儲屬性。

注意

必須聲明懶惰存儲屬性為變量屬性(通過var),因為它的初始值直到實例初始化完成之后才被檢索。常量屬性在實例初始化完成之前就應(yīng)該被賦值,因此常量屬性不能夠被聲明為懶惰存儲屬性。

當(dāng)屬性初始值因為外部原因,在實例初始化完成之前不能夠確定時,就要定義成懶惰存儲屬性。當(dāng)屬性初始值需要復(fù)雜或高代價的設(shè)置,在它需要時才被賦值時,懶惰存儲屬性就派上用場了。

下面的例子使用懶惰存儲屬性來防止類中不必要的初始化操作。它定義了類DataImporter和類DataManager:

復(fù)制代碼代碼如下:

class DataImporter {
/*DataImporter is a class to import data from an external file.     The class is assumed to take a non-trivial amount of time to initialize.*/
var fileName = "data.txt"
// the DataImporter class would provide data importing functionality here
}
class DataManager {
@lazy var importer = DataImporter()
var data = String[]()
// the DataManager class would provide data management functionality here
}
let manager = DataManager()
manager.data += "Some data"
manager.data += "Some more data"
// the DataImporter instance for the importer property has not yet been created

 

類DataManager有一個稱為data的存儲屬性,它被初始化為一個空的String數(shù)組。雖然DataManager定義的其它部分并沒有寫出來,但可以看出DataManager的目的是管理String數(shù)據(jù)并為其提供訪問接口。

DataManager類的部分功能是從文件中引用數(shù)據(jù)。這個功能是由DataImporter類提供的,這個類需要一定的時間來初始化,因為它的實例需要打開文件并見內(nèi)容讀到內(nèi)存中。

因為DataManager實例可能并不需要立即管理從文件中引用的數(shù)據(jù),所以在DataManager實例被創(chuàng)建時,并不需要馬上就創(chuàng)建一個新的DataImporter實例。這就使得當(dāng)DataImporter實例在需要時才被創(chuàng)建理所當(dāng)然起來。

因為被聲明為@lazy屬性,DataImporter的實例importer只有在當(dāng)它在第一次被訪問時才被創(chuàng)建。例如它的fileName屬性需要被訪問時:

 

復(fù)制代碼代碼如下:

println(manager.importer.fileName)
// the DataImporter instance for the importer property has now been created
// prints "data.txt

 

存儲屬性與實例變量

如果你使用過Objective-C,你應(yīng)該知道它提供兩種方式來存儲作為類實例一部分的值與引用。除了屬性,你可以使用實例變量作為屬性值的后備存儲

Swift使用一個單一屬性聲明來統(tǒng)一這些概念。一個Swift屬性沒有與之相符的實例變量,并且屬性的后備存儲也不能直接訪問。這防止了在不通上下文中訪問值的混淆,并且簡化屬性聲明成為一個單一的、最終的語句。關(guān)于屬性的所有信息-包含名稱、類型和內(nèi)存管理等-作為類型定義的一部分而定義。

2、計算屬性

除了存儲屬性,類、結(jié)構(gòu)和枚舉能夠定義計算屬性。計算屬性并不存儲值,它提供getter和可選的setter來間接地獲取和設(shè)置其它的屬性和值。

 

復(fù)制代碼代碼如下:

struct Point {
var x = 0.0, y = 0.0
}
struct Size {
var width = 0.0, height = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
println("square.origin is now at (/(square.origin.x), /(square.origin.y))")
// prints "square.origin is now at (10.0, 10.0)"

 

這個例子定義了三個處理幾何圖形的結(jié)構(gòu):

Point包含一個(x,y)坐標(biāo)
Size包含寬度width和高度height
Rect定義了一個長方形,包含原點和大小size
Rect結(jié)構(gòu)包含一個稱之為center的計算屬性。Rect當(dāng)前中心點的坐標(biāo)可以通過origin和size屬性得來,所以并不需要顯式地存儲中心點的值。取而代之的是,Rect定義一個稱為center的計算屬性,它包含一個get和一個set方法,通過它們來操作長方形的中心點,就像它是一個真正的存儲屬性一樣。

例子中定義了一個名為square的Rect變量,它的中心點初始化為(0, 0),高度和寬度初始化為10,由以下圖形中的藍色正方形部分。

變量square的center屬性通過點操作符訪問,它會調(diào)用center的getter方法。不同于直接返回一個存在的值,getter方法要通過計算才能返回長方形的中心點的值(point)。以上的例子中,getter方法返回中心點(5,5)。

然后center屬性被設(shè)置成新的值(15,15),這樣就把這個正方形向右向上移動到了途中黃色部分所表示的新的位置。通過調(diào)用setter方法來設(shè)置center,改變origin中坐標(biāo)x和y的值,將正方形移動到新的位置。

Swift教程之屬性詳解

setter聲明的簡略寫法

如果計算屬性的setter方法沒有將被設(shè)置的值定義一個名稱,將會默認(rèn)地使用newValue這個名稱來代替。下面的例子采用了這樣一種特性,定義了Rect結(jié)構(gòu)的新版本:

復(fù)制代碼代碼如下:

struct AlternativeRect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}

 

只讀計算屬性

只讀計算屬性只帶有一個getter方法,通過點操作符,可以放回屬性值,但是不能修改它的值。
注意
應(yīng)該使用var關(guān)鍵字將計算屬性-包含只讀計算屬性-定義成變量屬性,因為它們的值并不是固定的。let關(guān)鍵字只被常量屬性說使用,以表明一旦被設(shè)置它們的值就是不可改變的了

通過移除get關(guān)鍵字和它的大括號,可以簡化只讀計算屬性的定義:

 

復(fù)制代碼代碼如下:

struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
println("the volume of fourByFiveByTwo is /(fourByFiveByTwo.volume)")
// prints "the volume of fourByFiveByTwo is 40.0

 

這個例子定義了一個三維長方體結(jié)構(gòu)Cuboid,包含了長寬高三個屬性,和一個表示長方體容積的只讀計算屬性volume。volume值是不可被設(shè)置的,因為它直接由長寬高三個屬性計算而來。通過提供這樣一個只讀計算屬性,Cuboid使外部用戶能夠訪問到其當(dāng)前的容積值。

3、屬性觀察者

屬性觀察者觀察屬性值的改變并對此做出響應(yīng)。當(dāng)設(shè)置屬性的值時,屬性觀察者就被調(diào)用,即使當(dāng)新值同原值相同時也會被調(diào)用。

除了懶惰存儲屬性,你可以為任何存儲屬性加上屬性觀察者定義。另外,通過重寫子類屬性,也可以繼承屬性(存儲或計算)加上屬性觀察者定義。屬性重寫在“重寫”章節(jié)定義。

注意
不必為未重寫的計算屬性定義屬性觀察者,因為可以通過它的setter方法直接對值的改變做出響應(yīng)

定義屬性的觀察者時,你可以單獨或同時使用下面的方法:
willSet:設(shè)置值前被調(diào)用
didSet:設(shè)置值后立刻被調(diào)用

當(dāng)實現(xiàn)willSet觀察者時,新的屬性值作為常量參數(shù)被傳遞。你可以為這個參數(shù)起一個名字,如果不的話,這個參數(shù)就默認(rèn)地被命名成newValue。

在實現(xiàn)didSet觀察者時也是一樣,只不過傳遞的產(chǎn)量參數(shù)表示的是舊的屬性值。

注意:
屬性初始化時,willset和didSet并不會被調(diào)用。只有在初始化上下文之外,當(dāng)設(shè)置屬性值時才被調(diào)用

下面是一個willSet和didSet用法的實例。定義了一個類StepCounter,用來統(tǒng)計人走路時的步數(shù)。它可以從計步器或其它計數(shù)器上獲取輸入數(shù)據(jù),對日常聯(lián)系鍛煉的步數(shù)進行追蹤。

 

復(fù)制代碼代碼如下:

class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
println("About to set totalSteps to /(newTotalSteps)")
}
didSet {
if totalSteps > oldValue  {
println("Added /(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

 

類StepCounter聲明了一個Int類型的、含有willSet和didSet觀察者的存儲屬性totalSteps。當(dāng)這個屬性被賦予新值時,willSet和didSet將會被調(diào)用,即使新值和舊值是相同的。

例子中的willSet觀察者為參數(shù)起了個新的名字newTotalSteps,它簡單地打印了即將被設(shè)置的值。

當(dāng)totalSteps值被更新時,didSet觀察者被調(diào)用,它比較totalSteps的新值和舊值,如果新值比舊值大,就打印所增加的步數(shù)。didSet并沒有為舊值參數(shù)命名,在本例中,將會使用默認(rèn)的名字oldValue來表示舊的值。

注意

如果通過didSet來設(shè)置屬性的值,即使屬性值剛剛被設(shè)置過,起作用的也將會是didSet,即新值是didSet設(shè)置的值

4、全局和局部變量

以上所寫的關(guān)于計算與觀察屬性值的特性同樣適用于全局和局部變量。全局變量是在任何函數(shù)、方法、閉包、類型上下文外部定義的變量,而局部變量是在函數(shù)、方法、閉包中定義的變量。

前面章節(jié)所遇到過的全局、局部變量都是存儲變量。和存儲屬性一樣,存儲變量為特定類型提供存儲空間并且可以被訪問

但是,你可以在全局或局部范圍定義計算變量和存儲變量觀察者。計算變量并不存儲值,只用來計算特定值,它的定義方式與計算屬性一樣。

注意
全局常量和變量通常是延遲計算的,跟懶惰存儲屬性一樣,但是不需要加上@lazy。而局部常量與變量不是延遲計算的。

5、類型屬性

實例屬性是特定類型實例的屬性。當(dāng)創(chuàng)建一個類型的實例時,這個實例有自己的屬性值的集合,這將它與其它實例區(qū)分開來。

也可以定義屬于類型本身的屬性,即使創(chuàng)建再多的這個類的實例,這個屬性也不屬于任何一個,它只屬于類型本身,這樣的屬性就稱為類型屬性。

類型屬性適用于定義那些特定類型實例所通用的屬性,例如一個可以被所有實例使用的常量屬性(就像c中的靜態(tài)常量),或者變量屬性(c中的靜態(tài)變量)。

可以為值類型(結(jié)構(gòu)、枚舉)定義存儲類型屬性和計算類型屬性。對類而言,只能夠定義計算類型屬性。

值類型的存儲類型屬性可以是常量也可以是變量。而計算類型屬性通常聲明成變量屬性,類似于計算實例屬性

注意
不想存儲實例屬性,你需要給存儲類型屬性一個初始值。因為類型本身在初始化時不能為存儲類型屬性設(shè)置值

類型屬性句法

在C和Objective-C中,定義靜態(tài)常量、變量和全局靜態(tài)變量一樣。但是在swift中,類型屬性的定義要放在類型定義中進行,在類型定義的大括號中,顯示地聲明它在類型中的作用域。

對值類型而言,定義類型屬性使用static關(guān)鍵字,而定義類類型的類型屬性使用class關(guān)鍵字。下面的例子展示了存儲和計算類型屬性的用法:

 

復(fù)制代碼代碼如下:

struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
// return an Int value here
}
}
enum SomeEnumeration {
static var storedTypeProperty = "Some value."     static var computedTypeProperty: Int {     // return an Int value here
}
}
class SomeClass {
class var computedTypeProperty: Int {
// return an Int value here
}
}

 

注意

上面的例子是針對只讀計算類型屬性而言的,不過你也可以像計算實例屬性一樣定義可讀可寫的計算類型屬性

查詢與設(shè)置類型屬性

像實例屬性一樣,類型屬性通過點操作符來查詢與設(shè)置。但是類型屬性的查詢與設(shè)置是針對類型而言的,并不是針對類型的實例。例如:

 

復(fù)制代碼代碼如下:

println(SomeClass.computedTypeProperty)
// prints "42"
println(SomeStructure.storedTypeProperty)
// prints "Some value."
SomeStructure.storedTypeProperty = "Another value."
println(SomeStructure.storedTypeProperty)
// prints "Another value.

 

下面的例子在一個結(jié)構(gòu)中使用兩個存儲類型屬性來展示一組聲音通道的音頻等級表。每個通道使用0到10來表示聲音的等級。

從下面的圖表中可以看出,使用了兩組聲音通道來表示一個立體聲音頻等級表。當(dāng)一個通道的等級為0時,所有的燈都不會亮,當(dāng)?shù)燃墳?0時,所有的燈都會亮。下面的圖中,左邊的通道表示聲音等級為9,右邊的為7

Swift教程之屬性詳解

上述的聲音通道由以下的AudioChannel結(jié)構(gòu)實例來表示:

 

復(fù)制代碼代碼如下:

struct AudioChannel {
static let thresholdLevel = 10
static var maxInputLevelForAllChannels = 0
var currentLevel: Int = 0 {
didSet {
if currentLevel > AudioChannel.thresholdLevel {
//cap the new audio level to the threshold level
currentLevel = AudioChannel.thresholdLevel
}
if currentLevel > AudioChannel.maxInputLevelForAllChannels {
// store this as the new overall maximum input level
AudioChannel.maxInputLevelForAllChannels = currentLevel
}
}
}
}

 

AudioChannel結(jié)構(gòu)定義了兩個存儲類型屬性。thresholdLevel定義了音頻所能達到的最高等級,對所有的AudoChannel實例而言,是個值為10的常量。當(dāng)一個聲音信號的值超過10時,會被截斷為其閾值10。

第二個類型屬性是一個變量存儲屬性maxInputLevelForAllChannels。它保存了當(dāng)前所有AudioChannel實例中所接受到聲音的最高等級,它被初始化為0。

結(jié)構(gòu)還定義了一個存儲實例屬性currentLevel,表示當(dāng)前的通道聲音等級。這個屬性使用didSet屬性觀察者來檢測currentLevel的改變。這個觀察者執(zhí)行兩道檢查:

如果currentlevel的新值比閾值thresholdLevel大,currentLevel將被設(shè)置成thresholdLevel
如果currentLevel的新值比所有AudioChannel實例之前接受到的最大聲音等級還要大,那么maxInputLevelForAllChannles將會被設(shè)置成cueentLevel大值。

注意

第一道檢查中,didSet為currentLevel設(shè)置了新值。這并不會造成觀察者再次被調(diào)用

可以創(chuàng)建兩個AudioChannel實例,leftChannel和rightChannel,來表示一個立體聲系統(tǒng):

復(fù)制代碼代碼如下:

var leftChannel = AudioChannel()
var rightChannel = AudioChannel()

如果設(shè)置左通道的currentLevel為7,它的類型屬性maxInputLevelForAllChannels將更新成為7:

 

 

復(fù)制代碼代碼如下:

leftChannel.currentLevel = 7
println(leftChannel.currentLevel)
// prints "7"
println(AudioChannel.maxInputLevelForAllChannels)
// prints "7”
 
如果像設(shè)置右通道的currentlevel為11,它的值將被截短成為10,而且maxInputLevelForAllChannels的值也將更新為10:
“rightChannel.currentLevel = 11
println(rightChannel.currentLevel)
// prints "10"
println(AudioChannel.maxInputLevelForAllChannels)
// prints "10"


注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
五月天婷婷丁香网| 欧美在线免费观看| 天堂av手机版| 国产精品免费在线免费| 国产精品毛片va一区二区三区| 日韩欧国产精品一区综合无码| 亚洲国产精品一区二区久| 亚洲a∨一区二区三区| 老熟妇仑乱一区二区av| 久久成人免费日本黄色| 成人黄色图片网站| 日韩国产成人在线| 国产亚洲一区二区三区不卡| 国产又爽又黄网站亚洲视频123| 日本三级中国三级99人妇网站| 久久久久久久久久97| 人妻激情偷乱视频一区二区三区| 日韩精品一区二区在线视频| 成人av网站在线播放| 污污网站在线免费观看| 激情综合亚洲精品| 国产精品女人毛片| 久久99久国产精品黄毛片入口| 亚洲一级网站| 欧美激情视频一区二区三区免费| 欧美最猛黑人xxxx黑人猛叫黄| 91久久影院| 懂色中文一区二区在线播放| 日韩免费一区二区三区在线播放| 风间由美一区二区三区在线观看| 日本一区二区在线不卡| 亚洲影院在线| 丁香婷婷综合网| 国产成人免费| 亚洲日本国产精品| 超碰在线12| 欧美高清视频在线播放| 日本.亚洲电影| 国产精品一卡二卡在线观看| 国产精品入口免费麻豆| 少妇人妻无码专区视频| 日本粉色视频在线观看| 国产情侣久久久久aⅴ免费| 亚洲经典三级| av蜜臀在线| 福利在线白白| 午夜a一级毛片亚洲欧洲| 亚洲国产一二三精品无码| eeuss一区二区三区| 久久视频精品在线观看| 久久久久www| 国产精品久久久久久久久搜平片| 91亚洲精品久久久| аⅴ资源新版在线天堂| 68精品国产免费久久久久久婷婷| 污污视频网站在线免费观看| 色哟哟精品视频| 国产高清一区视频| 久久久久无码国产精品不卡| www.啪啪.com| 精品久久久香蕉免费精品视频| 日韩在线一区视频| 嫩草影院一区二区三区| 日本高清视频免费观看| 国产天堂视频在线观看| 无码国模国产在线观看| 最近中文字幕在线mv视频在线| 久热中文字幕在线观看| 中国毛片在线观看| 91视频国产高清| 国产精品亚洲二区在线观看| 91精品啪aⅴ在线观看国产| 国产精品久久久久7777| 日本精品性网站在线观看| 中文字幕佐山爱一区二区免费| 欧美第一淫aaasss性| 亚洲性av在线| 亚洲大胆在线| 国产成人精品在线| 精品视频在线一区二区在线| 成人影片在线播放| 日韩精品国产精品| 好吊视频一区二区三区四区| 亚洲国产小视频在线观看| 性感女国产在线| 又黄又免费的网站| 国模精品一区二区三区色天香| 国产欧美日韩另类视频免费观看| 在线观看免费一区| 色婷婷精品久久二区二区密| 成人小视频免费观看| 劲爆欧美第一页| 亚洲综合一区二区三区| 午夜在线a亚洲v天堂网2018| 成年女人午夜毛片免费看| 性xx色xx综合久久久xx| 亚洲成人第一页| av女同在线| 国产福利在线播放| 亚洲激情精品| 久久久av一区| 国产一级二级三级视频| 欧美一区二区视频在线观看| 国产欧美日韩精品高清二区综合区| 欧美日韩国产精品激情在线播放| 青青视频在线观| 大片免费在线观看| 色综合天天综合| 免费看一级大黄情大片| 欧美成人三级电影在线| 国产女人18毛片水真多成人如厕| 男女污污视频在线观看| 亚洲国模精品私拍| 欧美一区二视频在线免费观看| mm131美女视频| 成人亚洲精品777777大片| 男人的天堂在线视频| 毛片毛片毛片毛片毛片毛片| 制服丝袜在线播放| 欧美色图色就是色| 国产精品一区二区三区四区五区| 在线免费观看黄色| 欧美精品18videos性欧| 成人在线观看网站| 日韩电影毛片| 国产suv精品一区二区四区视频| 亚洲天堂电影在线观看| 久久久久亚洲av无码专区首jn| 国产美女喷水视频| 免费黄色小视频在线观看| 亚洲春色综合另类校园电影| 亚洲精品无码久久久久久| 九九久久九九| 国产精品特级毛片一区二区三区| 久久久久久久| 欧美不卡一区二区三区四区| 欧美卡一卡二卡三| 超碰中文字幕在线观看| 97人妻精品视频一区| xxx欧美精品| 黄色av免费在线| 97久久国产亚洲精品超碰热| 日本午夜视频在线观看| 免费极品av一视觉盛宴| 欧美日韩亚洲在线观看| 久久综合九色综合97婷婷| 精品国产乱码久久久久久图片| 国产精品自拍网站| 国产一区日韩| 中文字幕一区二区三区人妻在线视频| 午夜伦理精品一区| 香蕉视频在线观看网站| 影视一区二区三区| 一区二区三区四区在线免费视频| www.操.com| 92久久精品| 好吊色欧美一区二区三区视频| 97精品免费视频| 九九99久久精品在免费线bt| 欧美一区电影| 日韩精品伦理第一区| 在线三级电影| 免费久久精品| 国产中文字幕乱人伦在线观看| 亚洲激情在线播放| 色噜噜狠狠狠综合曰曰曰| 激情福利在线| 亚洲五月婷婷| 视频这里只有精品| 黄色一级视频免费观看| 欧美成人精品福利网站| 俺去啦最新官网| 九九热在线观看视频| 欧美成人一品| 欧美精品一区二区三| 国产亚洲欧美日韩精品一区二区三区| 激情六月天婷婷| 韩国三级hd中文字幕有哪些| 成人欧美一区二区三区在线播放| 日韩电影在线观看完整免费观看| 欧美日韩一区二区三区69堂| 亚洲bt欧美bt精品777| 久久免费少妇高潮99精品| 亚洲成人av在线电影| 亚洲成人xxx| 满满都是荷尔蒙韩剧在线观看| 日韩av毛片| h版电影在线播放视频网址| 国内揄拍国内精品少妇国语| 欧美激情一区二区三区在线视频观看| 69中国xxxxxxxxx69| 91久久国产| 国产成人午夜视频网址| 97色在线视频观看| av片免费观看| www.av在线视频| 草莓视频性福宝| 中文字幕日韩在线播放| 尤物视频在线视频| 欧美巨大丰满猛性社交| 九九九热视频| 草草视频在线一区二区| 五月天激情视频在线观看| 欧美肥胖老妇做爰| 2019中文字幕在线电影免费| 国产黄色片在线免费观看| 久久精品成人| 亚洲a∨精品一区二区三区导航| 亚洲一区二区三区在线观看视频| 九九热免费在线观看| 国产一区二区三区av电影| 久久久久久久久久影院| 97成人在线视频| 欧美日本精品一区二区三区| 中文字幕在线观看视频免费| 日本在线观看网站| 午夜精产品一区二区在线观看的| 欧美黑人经典片免费观看| 久热国产精品视频一区二区三区| 亚洲一区二区黄| 国产精品视频男人的天堂| 久久久久久久久久久黄色| 色大18成网站www在线观看| 国产狼人综合免费视频| 久久视频在线免费观看| 波多野结衣的一区二区三区| 亚洲精品一区二区三区99| 免费观看欧美成人禁片| 青青久久aⅴ北条麻妃| 亚洲精品午夜视频| 2021久久国产精品不只是精品| 国产白丝在线观看| 亚洲精品wwwww| 激情伊人五月天| 欧美国产91| k8久久久一区二区三区| 好妞色妞国产在线视频| 天堂网www在线资源中文| 欧美调教在线| 精精国产xxx在线视频app| 欧美一区二区三区粗大| 亚洲欧美视频在线观看视频| 91精品视频在线播放| 理论片影音先锋| 国产精品嫩草影院com| 美国十次了思思久久精品导航| 国产亚洲激情视频在线| 69xxx视频hd| 在线成人免费视频| 免费日韩电影在线观看| 国产午夜在线播放| 亚洲精品一二三四区| 黄色国产小视频| 91看片就是不一样| 欧美二区在线看| 国产精品天天av精麻传媒| 在线日韩影院| 9l视频自拍九色9l视频成人| 蜜桃av乱码一区二区三区| 在线免费中文字幕| 91精品国产色综合久久不卡粉嫩| 精品国产乱码久久久久久图片| 亚洲国产一区二区三区在线| www.国产视频.com| 欧美成人三级| 18成人免费观看视频| 国产精品一二三区在线| 一二三四中文在线| 国语对白做受69按摩| 欧美另类老女人| 超污网站在线观看| 国产伦精品一区二区三区视频金莲| 中文字幕麻豆| 欧美亚洲另类在线观看| 亚洲一区二区日本| 亚洲电影av| 天天干天天舔天天射| 亚洲经典在线| 国产精品黄页网站在线播放免费| 麻豆91在线播放| 这里只有精品视频在线| 日韩一卡二卡在线观看| 亚洲免费在线精品一区| 久久成人在线| 国产午夜精品久久久久免费视| 亚洲精品永久视频| 无夜福利视频观看| 中文字幕一二三| 黄色av网址在线观看| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 99在线免费视频观看| 日韩欧美极品在线观看| 97香蕉碰碰人妻国产欧美| 亚洲欧美激情视频在线观看一区二区三区| 亚洲国产精品久久久久久女王| 福利小视频在线| 国产一二三四在线视频| 麻豆精品国产91久久久久久| 国产精品一区二区三区久久久| 免费一级欧美片在线播放| 国产精品一区二区三区四区色| 久久精品视频播放| 欧美mv日韩mv国产网站| 最新在线中文字幕| 日本精品一区二区三区在线| 小草在线视频在线免费视频| 美女av在线免费看| 美国av在线播放| 日韩欧美色视频| 韩国av中文字幕| 国产美女视频一区二区三区| 欧美美乳视频网站在线观看| aaa毛片在线观看| 99久久国产综合精品麻豆| 欧美亚洲在线日韩| 丁香六月色婷婷| 丁香综合五月| 一个人看的www免费观看视频| 亚洲天堂视频在线观看| 男女18免费网站视频| 国产亚洲一区二区三区在线观看| 99re这里只有精品在线| 久久激情视频免费观看| 男人操女人免费网站| 免费黄色在线看| 国产精品素人视频| 婷婷丁香花五月天| 亚欧洲精品视频|