精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從Objective-C到Swift——Swift糖果

移動開發 iOS
Swift帶來很多確實很棒的特性,使得很難再回到Objective-C。主要的特性是安全性,不過這也被看成是一種額外副作用。

[[115298]]

Swift帶來很多確實很棒的特性,使得很難再回到Objective-C。主要的特性是安全性,不過這也被看成是一種額外副作用。

帶類型接口的強型別

Swift有強型別,這意味著除非你要求,不然Swift不會為你做類型之間的轉換。所以,例如你無法把Int型賦給Double型。你不得不首先轉換類型:

  1. let i: Int = 42 
  2. let d: Double = Double(i) 

或者你必須給Double類擴展一個方法用來轉換Int型:

  1. extension Double { 
  2.         func __convert(i: Int) -> Double { 
  3.             return Double(i) 
  4.         } 
  5.     } 
  6.     let another_d: Double = i 

強型別對于安全性是非常非常有利的。但是,如果它沒有為你給類型接口添加許多類型信息的話,它也可能變成有一點令人生畏的事情,有點像是在寫腳本語言。

  1. let ary = ["Hello""world"// NOTE: 'ary' is of type String[] or Array<String> 
  2.     for s in ary { // NOTE: 's' is of type String 
  3.         print(s + " "
  4.     } 

如果你想要創建一個包含很多類型(無共同祖先)的數組,你應該用枚舉(它可以包含值,見如下)。如果你想要它能夠包含所有值,你可以用Any型。如果想讓它包含任何Objective-C的類型,那就用AnyObject型。

請注意類型接口不會在申明函數的時候為你添加類型。你必須明確地說明你所申明函數的類型。

Blocks

Swift 中的Blocks很像Objective-C中的Blocks, 不過有兩點不同: 類型推斷和避免weakify dance.

對于類型推斷,你不必每次寫block時都包含完整類型信息:

  1. sort([2,1,3], { 
  2.         (a: Int, b: Int) -> Bool in return a < b 
  3.     }) 
  4.       
  5.     // Using Type Inference 
  6.     // Using the Trailing Closures feature 
  7.       
  8.     sort([2,1,3]) { 
  9.         a, b in return a < b 
  10.     } 
  11.       
  12.     // Implicit 'return' for single-expression blocks 
  13.       
  14.     sort([2,1,3]) { a,b in a<b } 
  15.       
  16.     // Shorthand Argument Names 
  17.       
  18.     sort([2,1,3]) { $0 < $1 } 
  19.       
  20.     // Operators are functions, and functions are blocks too! 
  21.       
  22.     let sorted: Int[] = sort([2,1,3], <) 

訪問 Closures 了解更多blocks信息。

除此之外,Objectvie-C 的weakify dance有點容易,只需在block的開始處加上  [unowned self] 或 [weak self]  即可。

  1. class CallbackTest { 
  2.         var i = 5 
  3.         var callback: (Int -> ())? // NOTE: The optional callback takes an Int 
  4.         deinit { // NOTE: This is like -dealloc in Objective-C 
  5.             println("Deinit"
  6.         } 
  7.     } 
  8.       
  9.     var obj = CallbackTest() 
  10.     obj.callback = { 
  11.         [unowned obj] // NOTE: Without this, deinit() would never be invoked! 
  12.         a in 
  13.         obj.i = a 
  14.     } 

請注意Introduction post文章中介紹了Optional(像上面的callback)。

請參考 ARC 章節來了解更多關于Swift中ARC的信息。

強勁的Enumerations

Swift中的枚舉比Objective-C中的有很大提高。

修復 Enums

Apple一直提倡顯示的提供枚舉類型的大小,不過被Objective-C搞亂了:

  1. // Apple recommended enum definition in Objective-C 
  2.     typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { 
  3.         UIViewAnimationCurveEaseInOut, 
  4.         UIViewAnimationCurveEaseIn, 
  5.         UIViewAnimationCurveEaseOut, 
  6.         UIViewAnimationCurveLinear 
  7.     }; 
  8.       
  9.     // Previous Apple recommended enum definition in Objective-C. No link between  
  10.     // enum values and theUIViewAnimationCurve type. 
  11.     typedef enum { 
  12.         UIViewAnimationCurveEaseInOut, 
  13.         UIViewAnimationCurveEaseIn, 
  14.         UIViewAnimationCurveEaseOut, 
  15.         UIViewAnimationCurveLinear 
  16.     }; 
  17.     typedef NSInteger UIViewAnimationCurve; 
  18.       
  19.     // Traditional enum definition in Objective-C. No explicit fixed size. 
  20.     typedef enum { 
  21.         UIViewAnimationCurveEaseInOut, 
  22.         UIViewAnimationCurveEaseIn, 
  23.         UIViewAnimationCurveEaseOut, 
  24.         UIViewAnimationCurveLinear 
  25.     } UIViewAnimationCurve; 

Swift中的修復:

  1. enum UIViewAnimationCurve : Int { 
  2.         case EaseInOut 
  3.         case EaseIn 
  4.         case EaseOut 
  5.         case Linear 
  6.     } 

拓展Enums

Enums 在Swift中更進一步,只作為一個獨立的選項列表。你可以添加方法(以及計算屬性):

  1. enum UIViewAnimationCurve : Int { 
  2.         case EaseInOut 
  3.         case EaseIn 
  4.         case EaseOut 
  5.         case Linear 
  6.         func typeName() -> String { 
  7.             return "UIViewAnimationCurve" 
  8.         } 
  9.     } 

使用類型拓展,你可以向枚舉中添加任何你想要的方法:

  1. extension UIViewAnimationCurve { 
  2.         func description() -> String { 
  3.             switch self { 
  4.             case EaseInOut: 
  5.                 return "EaseInOut" 
  6.             case EaseIn: 
  7.                 return "EaseIn" 
  8.             case EaseOut: 
  9.                 return "EaseOut" 
  10.             case Linear: 
  11.                 return "Linear" 
  12.             } 
  13.         } 
  14.     } 

#p#

向Enums中添加值

Swift中的枚舉跟進一步,允許每一個獨立的選項都有一個對應的值:

  1. enum Shape { 
  2.         case Dot 
  3.         case Circle(radius: Double) // Require argument name! 
  4.         case Square(Double) 
  5.         case Rectangle(width: Double, height: Double) // Require argument names! 
  6.         func area() -> Double { 
  7.             switch self { 
  8.             case Dot: 
  9.                 return 0 
  10.             case Circle(let r): // Assign the associated value to the constant 'r' 
  11.                 return π*r*r 
  12.             case Square(let l): 
  13.                 return l*l 
  14.             case Rectangle(let w, let h): 
  15.                 return w*h 
  16.             } 
  17.         } 
  18.     } 
  19.     var shape = Shape.Dot 
  20.     shape = .Square(2) 
  21.     shape = .Rectangle(width: 3, height: 4) // Argument names required 
  22.     shape.area() 

如果你喜歡,你可以把它當做一個安全的union類型。或者只用枚舉應該做的事情。

Enumerations 文章介紹了更多關于Apple對此的看法。

Swift Switch語句

就像你看到的,Swift中switch語句有很多優化。

 隱式的fall-through行為已經改為了顯示的:

  1. var (i, j) = (4, -1) // Assign (and create) two variables simultaneously 
  2.     switch i { 
  3.     case 1: 
  4.         j = 1 
  5.     case 2, 3: // The case for both 2 and 3 
  6.         j = 2 
  7.     case 4: 
  8.         j = 4 
  9.         fallthrough 
  10.     case 5: 
  11.         j++ 
  12.     default
  13.         j = Int.max // The Swift version of INT_MAX 
  14.     } 

就像前面看到的,Switch 語句可以訪問枚舉的關聯值,不過它還可以做更多:

  1. var tuple: (Int, Int) // Did I mention that Swift has tuples? :-) 
  2.     var result: String 
  3.       
  4.     tuple = (1,3) 
  5.       
  6.     switch tuple { 
  7.     case (let x, let y) where x > y: 
  8.         result = "Larger" 
  9.     case (let x, let y) where x < y: 
  10.         result = "Smaller" 
  11.     default
  12.         result = "Same" 
  13.     } 

甚至可以使用String:

  1. var s: String = "Cocoa" 
  2.     switch s { 
  3.     case "Java":   s = "High caffeine" 
  4.     case "Cocoa":  s = "High sugar" 
  5.     case "Carbon": s = "Lots of bubbles" 
  6.     default: () 
  7.     } 

另外,如果你覺得他可以使你的代碼更可讀,你可以重載~=操作符來改變switch語句的行為。

  1. func ~=(pattern: String, str: String) -> Bool { 
  2.         return str.hasPrefix(pattern) 
  3.     }  
  4.     var s = "Carbon" 
  5.     switch s { 
  6.     case "J":  s = "High caffeine" 
  7.     case "C":  s = "No caffeine" 
  8.     default: () 
  9.     } 

你可以從 Conditional Statements 這篇文章中了解更多關于switch語句的知識。

類與結構體

類似于C++,Swift的類與結構體初看是一樣的:

  1. class Apple { 
  2.         var color = "green" // Property declaration 
  3.         init() {} // Default initializer 
  4.         init(_ color: String) { // '_' means no argument name 
  5.             self.color = color 
  6.         } 
  7.         func description() -> String { 
  8.             return "apple of color \(color)" 
  9.         } 
  10.         func enripen() { 
  11.             color = "red" 
  12.         } 
  13.     } 
  14.       
  15.     struct Orange { 
  16.         var color = "green" 
  17.         init() {} 
  18.         init(_ color: String) { 
  19.             self.color = color 
  20.         } 
  21.         func description() -> String { 
  22.             return "orange of color \(color)" 
  23.         } 
  24.         mutating func enripen() { // NOTE: 'mutating' is required 
  25.             color = "orange" 
  26.         } 
  27.     } 
  28.       
  29.     var apple1 = Apple() 
  30.     var apple2 = apple1 // NOTE: This references the same object! 
  31.     apple1.enripen() 
  32.     apple2.description() // Result: "apple of color red" 
  33.       
  34.     var orange1 = Orange() 
  35.     var orange2 = orange1 // NOTE: This makes a copy! 
  36.     orange1.enripen() 
  37.     orange2.description() // Result: "orange of color green" 

主要的不同點在于類是(和塊相似的)引用類型,而結構體是(和枚舉相似的)數值類型。所以兩個變量能夠指向同一個(類的)對象,而把一個結構體賦給 另外一個變量則必須做一個此結構體的(緩慢的)拷貝。關鍵詞'mutating'告訴調用者enripen()方法不能被常結構體調用。把一個常引用 mutating給一個類對象則沒有問題。

Swift中大多數內建類型實際上都是結構體。甚至Int型也是。通過點擊Cmd你能夠看到內建類型的申明,比如Int型的Swift(或者 Playground)源碼。數組和詞典類型也是結構體,但是數組在某些方面表現得像是引用類型:賦值數組并不拷貝每一個元素,實際上你可以更新常數組只 要元素的個數保持不變。

  1. let array1 = [1, 2, 3] 
  2.     let array2 = array1 // A copy, but references the same elements! 
  3.     array1[1] = 5 // Legal, as it doesn't modify the struct but a referenced element 
  4.     array2 // Result: [1, 5, 3] 

在蘋果的文檔中,你可以讀到更多關于Collection Types的內容。

#p#

對象的生命周期

另一個類與結構體的不同是類可以被子類化。 雷和結構體都可以被拓展,并且實現protocol,但是只用類可以繼承其他類。

  1. class Pineapple : Apple { 
  2.         init(color: String) { 
  3.             super.init(color) 
  4.         } 
  5.         convenience init() { 
  6.             self.init("green"
  7.         } 
  8.         convenience init(ripe: Bool) { 
  9.             self.init() 
  10.             if ripe { 
  11.                 color = "yellow" 
  12.             } else { 
  13.                 color = "green" 
  14.             } 
  15.         } 
  16.         deinit { 
  17.             println("Pineapple down"
  18.         } 
  19.         override func description() -> String { 
  20.             return "pine" + super.description() 
  21.         } 
  22.         override func enripen() { 
  23.             color = "yellow" 
  24.         } 
  25.     } 

就像你看到的,Swift為繼承添加了一點更有趣的需要學習的東西。對于初學者來說,你需要清除你覆蓋父類中某個方法的意圖。如果你想阻止子類覆蓋一些東西,你可以在一個單獨聲明或整個類的前面加上@final屬性。閱讀 Apple’s documentation了解更多。

初始化

Swift的對象分兩步進行初始化: 首先對象必須是有效的,然后它能被替換。

  1. class ChildShoe { 
  2.         var size: Double // Uninitialized properties are not allowed unless taken care of in init() 
  3.         init(foot_size: Double) { 
  4.             size = foot_size // First make the object valid 
  5.             addGrowthCompensation() 
  6.         } 
  7.         func addGrowthCompensation() { 
  8.             size++ 
  9.         } 
  10.     } 

使對象有效必須要調用一個超級類指定的init()方法。類可以同時擁有指定的以及便捷的(用關鍵詞'convenience'標記)初始化方法。 便捷初始化方法調用同一個類中的其他初始化方法(最終還是一個指定的初始化方法),而指定的初始化方法調用超級類的初始化方法。

如果你給所有的超級類指定初始化方法添加初始化方法,你的類也會自動繼承所有便捷初始化方法。如果沒有添加任何指定的初始化方法,你的類則繼承超級類的所有(指定的和便捷的)初始化方法。

深入閱讀請參見Initialization

類型轉換

類之間的轉換,特別是向下轉換,你可以使用"is","as?"和"as"關鍵詞:

  1. let apple: Apple = Pineapple() 
  2.       
  3.     let exotic: Bool = apple is Pineapple 
  4.       
  5.     let pineappleOption: Pineapple? = apple as? Pineapple 
  6.     let pineapple: Pineapple = apple as Pineapple // NOTE: Throws if not! 
  7.       
  8.     if let obj = apple as? Pineapple { // If executed, 'obj' is a Pineapple 
  9.         "sweet" 
  10.     } 

想了解更多這方面內容請參見Type Casting一章.

泛型

泛型是Swift的一個加分的特點。他們看起來有一點像C++里面的模板,但是有更強的型別,也更簡單(更簡單使用,功能稍遜)。

  1. 01    // Mark both Int and Double as being convertible to a Double using the '+' prefix 
  2. 02  protocol DoubleConvertible { 
  3. 03      @prefix func +(v: Self) -> Double 
  4. 04  } 
  5. 05  @prefix func +(v: Int) -> Double { return Double(v) } 
  6. 06  extension Double: DoubleConvertible {} 
  7. 07  extension Int: DoubleConvertible {} 
  8. 08  // NOTE: Repeat this for all Int*, UInt*, and the Float type 
  9. 09    
  10. 10  // The traits of a generalized point 
  11. 11  protocol PointTraits { 
  12. 12      typealias T 
  13. 13      class var dimensions: Int { get } 
  14. 14      func getCoordinate(dimension: Int) -> T 
  15. 15  } 
  16. 16    
  17. 17  // Generalized Pythagoras 
  18. 18  struct Pythagoras<P1: PointTraits, P2: PointTraits where P1.T: DoubleConvertible, P2.T: DoubleConvertible> { 
  19. 19      static func apply(a: P1, b: P2, dimensions: Int) -> Double { 
  20. 20          if dimensions == 0 { 
  21. 21              return 0 
  22. 22          } 
  23. 23          let d: Double = +a.getCoordinate(dimensions-1) - +b.getCoordinate(dimensions-1) // NOTE: '+' to convert to Double 
  24. 24          return d * d + apply(a, b: b, dimensions: dimensions-1) 
  25. 25      } 
  26. 26      static func apply(a: P1, b: P2) -> Double { 
  27. 27          let dimensions = P1.dimensions 
  28. 28          assert(P2.dimensions == dimensions) 
  29. 29          return apply(a, b: b, dimensions: dimensions) 
  30. 30      } 
  31. 31  }; 
  32. 32    
  33. 33  import func Foundation.sqrt // NOTE: You can import a typealias&shy;, struct&shy;, class&shy;, enum&shy;, protocol&shy;, var&shy;, or func only 
  34. 34    
  35. 35  func distance<P1: PointTraits, P2: PointTraits where P1.T: DoubleConvertible, P2.T: DoubleConvertible>(a: P1, b: P2) -> Double { 
  36. 36      assert(P1.dimensions == P2.dimensions) 
  37. 37      return sqrt(Pythagoras.apply(a, b: b)); 
  38. 38  } 
  39. 39    
  40. 40  // A generalized 2D point 
  41. 41  struct Point2D<Number> : PointTraits { 
  42. 42      static var dimensions: Int { return 2 } 
  43. 43      var x: Number, y: Number 
  44. 44      func getCoordinate(dimension: Int) -> Number { return dimension == 0 ? x : y } // NOTE: The typealias T is inferred 
  45. 45  } 
  46. 46  let a = Point2D(x: 1.0, y: 2.0) 
  47. 47  let b = Point2D(x: 5, y: 5) 
  48. 48  Pythagoras.apply(a, b: b) // NOTE: Methods require all argument names, except the first 
  49. 49  distance(a, b) // NOTE: Functions do not require argument names 
  50. 50    
  51. 51  // UIColor 
  52. 52  extension UIColor : PointTraits { 
  53. 53      class var dimensions: Int { return 4 } 
  54. 54      func getCoordinate(dimension: Int) -> Double { 
  55. 55          var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0 
  56. 56          getRed(&red, green: &green, blue: &blue, alpha: &alpha) 
  57. 57          switch dimension { 
  58. 58          case 0: return red 
  59. 59          case 1: return green 
  60. 60          case 2: return blue 
  61. 61          defaultreturn alpha 
  62. 62          } 
  63. 63      } 
  64. 64  } 
  65. 65  distance(UIColor.redColor(), UIColor.orangeColor()) 

以上代碼是受Boost中的Design Rationale的啟發.幾何的C++庫。Swift中的泛型功能不是那么強,但是卻能使源碼比C++中泛型更具閱讀性。

Swift的泛型是通過類型參數化的。每個參數類型要求實現一個特定的協議或者繼承自一個特定的基類。在申明參數類型后,有一個可選 的"where"項目能用于給這個類型(或者是他們的內部類型,就如上面那個PointTraits協議中的別名'T')添加額外的需求。這 個"where“也能要求兩種類型是相等的。

蘋果有更多更完整的Generics章節。

選定Swift

現在你已經準備好了去看各種各樣的源碼了,甚至可以自己寫了 :-)

在把你自己留在一個新的大的Swift未知大陸之前,我有幾個最終的建議:

  • Apple推薦你使用Int作為所有Integer類型,即使你之前用無符號數的地方。“只有在你真的需要一個與平臺原生大小想相同的無符號integer類型時再使用UInt類型.”

  • 如果你想知道@private和al.在哪:好吧,他們還沒完成呢,后續版本會加進來的。

  • 如果你創建了一個module,你可以Cmd+單擊你的module的名字來查看你的module的自動生成的Swift頭。

  • Swift的modules其實是命名空間,因此在任何東西前加像 CF, NS, UI等的前綴。當創建第三方庫是就不是那么絕對必要了。

Enjoy using Swift!

責任編輯:閆佳明 來源: oschina
相關推薦

2014-10-13 09:54:08

Objective-CSwift

2015-06-08 10:02:40

swiftOC兼容

2014-09-26 09:49:48

SwiftObjective-C

2014-06-05 13:54:03

SwiftiOSObjective-C

2014-09-24 11:15:05

Objective-CSwift

2015-07-08 10:47:57

Using Swift CocoaObjective-C

2017-04-07 16:00:59

SwiftObjective-CFramework

2015-02-05 00:18:44

SwiftObjective-C

2015-06-25 11:21:33

C++Objective-C

2022-07-11 10:17:19

Swift編程語言項目

2014-06-16 10:02:42

SwiftiOSWWDC

2017-02-10 09:55:53

SwiftObjective-C

2015-05-14 10:26:37

Objective-CSwift

2015-06-15 14:58:25

swiftOC

2011-07-06 14:41:34

Objective-C

2014-06-09 12:58:48

編程語言排行榜

2016-03-30 09:56:07

c語言變量聲明objectivec

2011-08-10 18:07:29

Objective-C反射

2011-05-11 15:58:34

Objective-C

2011-05-11 11:20:26

Objective-C
點贊
收藏

51CTO技術棧公眾號

97久久综合区小说区图片区| 黄视频在线观看网站| 亚洲欧洲一区| 亚洲天堂av综合网| 亚洲精品第三页| 在线观看男女av免费网址| k8久久久一区二区三区 | 欧美精品久久天天躁| 青青在线视频免费观看| 美国成人毛片| 韩国v欧美v日本v亚洲v| 欧美孕妇孕交黑巨大网站| 成人在线观看免费高清| 9l视频自拍九色9l视频成人| 91国偷自产一区二区三区成为亚洲经典 | 亚洲色图另类小说| 久久91精品久久久久久秒播| 国内外成人免费激情在线视频| 一级黄色毛毛片| 免费看成人人体视频| 欧美日韩在线三级| 欧美三级一级片| 主播国产精品| 国产精品污www在线观看| 国产欧美日韩综合精品二区| 国产一区二区三区四区视频| 亚洲综合丁香| 久久久久久久久久国产精品| 欧美视频一区二区在线| 香蕉久久99| 精品国产百合女同互慰| 亚洲一级片av| 国产综合色在线观看| 欧美日韩免费在线| 日韩成人三级视频| av在线免费观看网址| 国产日韩综合av| 久久久久久久久久码影片| xxxwww在线观看| 老司机免费视频一区二区三区| 欧美亚洲国产成人精品| 国产一级片免费| 欧美 日韩 国产精品免费观看| 这里只有精品久久| 青青草视频成人| 亚洲网址在线观看| 69精品人人人人| 激情黄色小视频| 国产资源一区| 欧美蜜桃一区二区三区| 欧美女同在线观看| 91成人在线| 欧美亚洲综合久久| wwwwww.色| 日韩三级影视| 色婷婷亚洲综合| 玩弄japan白嫩少妇hd| sese综合| 欧美在线观看18| 中文字幕第17页| 香蕉久久一区| 欧美一级欧美一级在线播放| 日本一本在线视频| 欧美专区视频| 亚洲成在人线av| 亚洲一区二区三区综合| 国产精品久久久网站| 欧美精品一区男女天堂| 五十路六十路七十路熟婆| 麻豆一区二区麻豆免费观看| 亚洲精品综合久久中文字幕| 91久久免费视频| 欧美一区电影| 久久国产精品电影| 日本一区二区欧美| 蜜桃av综合| 国产欧美日韩精品丝袜高跟鞋| 国产精品久久久久久在线| 国产一区不卡精品| 国内外成人免费视频| 欧美伦理影视网| 国产精品久久久久久亚洲伦| 国产一级大片免费看| 波多野结衣精品| 色老综合老女人久久久| 在线能看的av网站| 国产成人在线中文字幕| 亚洲美女免费精品视频在线观看| 午夜影院黄色片| 欧美大片一区| 日本精品久久电影| 国产精品久久久久毛片| 99久久精品国产网站| 亚欧洲精品在线视频免费观看| 日本免费在线观看| 亚洲va韩国va欧美va| 黄色一级免费大片| 日韩一区网站| 亚洲天堂av在线免费观看| 印度午夜性春猛xxx交| 亚洲综合三区| 亚洲在线视频福利| 精品资源在线看| 亚洲精品菠萝久久久久久久| 无码无遮挡又大又爽又黄的视频| 精品视频一二| 亚洲一区二区精品| 久久久久人妻一区精品色欧美| 久久一区二区三区四区五区| 99视频国产精品免费观看| 国产在线视频网| 亚洲国产成人91porn| 可以看污的网站| 久草在线成人| 韩国精品美女www爽爽爽视频| 中文天堂在线播放| 91视频xxxx| 免费的av在线| 成人国产一区| 精品亚洲永久免费精品| 极品盗摄国产盗摄合集| 蜜臀99久久精品久久久久久软件| 精品在线一区| 欧美xxxx少妇| 正在播放亚洲一区| 欧美三级视频网站| 亚洲高清免费| 91在线精品播放| 91最新在线| 一本大道久久a久久综合婷婷| 特种兵之深入敌后| 91影院成人| 国产精品视频1区| 国产在线日本| 在线观看中文字幕不卡| 亚洲午夜久久久久久久久红桃| 国产精品大片| 7777精品久久久大香线蕉小说| jizzjizz在线观看| 欧洲另类一二三四区| 成人片黄网站色大片免费毛片| 亚洲精品日韩久久| 国产精品国产三级欧美二区 | 亚洲AV午夜精品| 亚洲欧美另类久久久精品2019| 日本超碰在线观看| 999国产精品视频| 91精品久久久久久久久| 欧美精品日韩少妇| 91精品国产综合久久福利| 国产美女福利视频| 国产资源精品在线观看| 亚洲免费视频播放| 精品国模一区二区三区欧美| 欧美成人精品不卡视频在线观看| 99久久免费国产精精品| 伊人开心综合网| 黄页网站在线看| 亚洲午夜精品久久久久久app| 国产精品久久久久免费| free性护士videos欧美| 日韩av最新在线| 一级片在线观看免费| 国产精品免费人成网站| 日本中文字幕精品—区二区| 亚洲老妇激情| 国产成人免费观看| 女海盗2成人h版中文字幕| 亚洲精品自拍视频| 中文字幕永久在线观看| 椎名由奈av一区二区三区| 亚洲三级在线视频| 在线观看视频免费一区二区三区| 久久综合九色欧美狠狠| 精品免费av在线| 久久久精品国产一区二区| 成人黄色免费视频| 欧美午夜精品在线| 女人裸体性做爰全过| 国产精品自在在线| 久久久久久久久久久99| 狠狠综合久久av一区二区蜜桃| 国产免费一区二区三区在线能观看| 超碰公开在线| 亚洲精品久久久久| 中文字幕网址在线| 亚洲一区二区三区视频在线| 熟女俱乐部一区二区视频在线| 久久狠狠亚洲综合| 青青青免费在线| 日韩.com| 精品视频第一区| 国产一区高清| 97在线观看视频国产| 香蕉视频免费在线播放| 亚洲国产另类久久精品| 中文字幕永久在线视频| 午夜精品久久久久久久| 俄罗斯毛片基地| 99久久er热在这里只有精品66| 国产九九热视频| 国产日韩一区二区三区在线| 午夜视频久久久| 欧美电影免费网站| 91免费精品国偷自产在线| 中文字幕成在线观看| 久久综合伊人77777| 香蕉视频免费在线看| 91麻豆精品国产91久久久久久| 久久艹免费视频| 一区二区国产盗摄色噜噜| 日本综合在线观看| 97se狠狠狠综合亚洲狠狠| 91aaa精品| 日韩专区中文字幕一区二区| 国产精品视频二| 久久亚洲精品中文字幕蜜潮电影| 久久国产精品-国产精品| 精品视频一二| 国产日韩亚洲欧美| 日日av拍夜夜添久久免费| 91极品女神在线| 日韩经典av| 久久国产精品免费视频| www免费网站在线观看| 亚洲精品小视频在线观看| 欧美一级特黄aaaaaa| 日韩亚洲欧美一区| 一二区在线观看| 在线看国产一区二区| 国产又大又黄又粗| 婷婷综合另类小说色区| 精品肉丝脚一区二区三区| 亚洲免费av在线| 九九精品视频免费| 18欧美乱大交hd1984| 欧美自拍偷拍网| 亚洲国产电影在线观看| 特级西西www444人体聚色 | 91社区视频在线观看| 国产日韩欧美高清在线| 一道本在线观看| 久久久一区二区三区| 毛片网站免费观看| 2021中文字幕一区亚洲| 爱爱的免费视频| 26uuu国产一区二区三区| 国产偷人妻精品一区| 久久夜色精品一区| 少妇真人直播免费视频| 久久久久久久久久美女| 91网站免费视频| 日本一区二区不卡视频| www成人啪啪18软件| 日韩久久一区二区| 欧美成人aaa片一区国产精品| 亚洲激情一二三区| 久草精品视频在线观看| 精品久久久久久久久国产字幕| 国产成人在线视频观看| 在线欧美一区二区| 夜夜躁很很躁日日躁麻豆| 欧美久久久一区| 黄色片一区二区| 亚洲欧美制服丝袜| 日本综合在线| 欧美国产中文字幕| videos性欧美另类高清| 国产精品色视频| 欧美经典影片视频网站| 国产日韩精品一区观看| 国产成人三级| 伊人精品久久久久7777| 欧美日韩三级| 人妻有码中文字幕| 久久99蜜桃精品| 中国特级黄色片| 欧美成人app| 亚洲欧美区自拍先锋| 性色国产成人久久久精品| 一区二区三区在线观看动漫| 日韩精品视频免费看| 91国产丝袜在线播放| 国产欧美久久久| 日韩精品视频免费在线观看| 思思99re6国产在线播放| 欧美极品少妇xxxxⅹ喷水| 欧美日韩大片| 91在线网站视频| 亚洲最好看的视频| 小泽玛利亚av在线| 男女精品视频| 极品人妻一区二区| 91免费版在线看| 中文字幕另类日韩欧美亚洲嫩草| 欧美视频在线免费看| 国产成人精品a视频| 亚洲人成电影网站色…| 性欧美高清come| 国产精品成人品| 成午夜精品一区二区三区软件| 先锋影音网一区| 国产日韩一区| 性一交一黄一片| 国产嫩草影院久久久久| 日本少妇全体裸体洗澡| 欧美精品在线一区二区三区| 欧美日韩免费做爰大片| 欧美日韩国产va另类| 激情欧美一区二区三区黑长吊| 精品久久蜜桃| 综合一区二区三区| 成人一区二区三| 成人免费视频一区二区| 久草视频手机在线| 欧美午夜寂寞影院| 天堂中文资源在线| 欧美国产精品日韩| 99视频这里有精品| 日韩亚洲欧美精品| 久久动漫亚洲| 国产精品久久不卡| 亚洲图片自拍偷拍| 国产毛片久久久久| 日韩日本欧美亚洲| 成人福利一区二区| 深夜福利成人| 日韩影院在线观看| 中文字幕第4页| 天天综合天天做天天综合| 成人免费观看在线视频| 成人444kkkk在线观看| 天堂综合在线播放| 亚洲在线色站| 美女脱光内衣内裤视频久久影院| 人妻熟女aⅴ一区二区三区汇编| 亚洲国产毛片aaaaa无费看| 精品国产亚洲AV| 欧美成人精品激情在线观看| 国产精品亚洲一区二区在线观看| 五月天色一区| 蜜桃久久精品一区二区| 一级黄色录像毛片| 欧美日韩一区 二区 三区 久久精品| 久草在现在线| 国产成人aa精品一区在线播放| 先锋影音国产精品| 久久午夜夜伦鲁鲁一区二区| 欧美国产精品中文字幕| 最近中文字幕在线观看| 精品国产一区二区三区在线观看 | 久久久久久国产精品免费无遮挡| 国产精品免费视频久久久| 色喇叭免费久久综合| 国内自拍第二页| 亚洲美女精品一区| 韩国av电影在线观看| 91大神在线播放精品| 九九热线有精品视频99| 另类小说第一页| 椎名由奈av一区二区三区| 国产成人麻豆精品午夜在线| 久久久久久久影院| 天堂99x99es久久精品免费| 成年人在线看片| 国产精品久久久久久户外露出 | 国产精品一区二区三区四区在线观看| 中文字幕中文字幕一区三区| 国产精品2024| 特一级黄色大片| 一区二区三区天堂av| 成人综合日日夜夜| 日本手机在线视频| 久久久久久影视| 91好色先生tv| 国产综合在线视频| 欧美色图一区| 成人三级做爰av| 日韩欧美第一页| 日本不卡不卡| 激情小说网站亚洲综合网| 日本亚洲最大的色成网站www| 久久久久久久久久97| 亚洲精品国产免费| jizzjizz少妇亚洲水多| 国产91视频一区| 国产日韩亚洲欧美综合| 国产sm主人调教女m视频| 91高清视频在线免费观看| 精品日韩免费| 深田咏美中文字幕| 欧美日韩在线播| 国产夫妻在线| www亚洲国产| 久久一留热品黄| 亚洲精品视频专区| 国产在线视频不卡| 国产精品久久久久9999高清| 欧美一区二区三区观看| 亚洲欧洲第一视频|