久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SwiftNote

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SwiftNote 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/– 課時22)標準庫源碼分析、項目實戰 –/

要點:

  • RxSwift有點重,一旦用了,整個項目就很難脫離它了。

標準庫源碼分析

Swift源碼簡介

  • Swift與2015年正式開源,github地址:https://github.com/apple/swift
  • 幾個可能會經常看的目錄
    • docs:一些文檔
    • stdlib:Swift源碼
    • lib:C++源碼
    • include:C++頭文件
  • 標準庫源碼位置
    • https://github.com/apple/swift/tree/main/stdlib/public/core

Array分析

  • map、filter
  • flatMap、compactMap、reduce

Substring分析

  • apped、lowercased、uppercased

Optional分析

  • map、flatMap、==、??

Metadata分析

反射

  • 反射是編程語言中一項強大的能力,比如Java語言的反射機制
    • 對于任意一個類型,都能夠動態獲取這個類的所有屬性和方法信息
    • 對于任意一個實例,都能夠動態調用它的任意方法和屬性
  • Swift的反射機制目前比較弱,通過Mirror類型來提供簡單的反射功能

常用Swift第三方庫

  • 網絡請求:https://github.com/Alamofire/Alamofire
  • 圖片下載:https://github.com/onevcat/Kingfisher
  • JSON訪問:https://github.com/SwiftyJSON/SwiftyJSON
  • JSON-Mode轉換:https://github.com/kakaopensource/KaKaJSON
  • HandyJSON:https://www.jianshu.com/p/939d33a626a0

Kingfisher注意點

  • Kingfisher默認不支持WebP格式的圖片,需要額外安裝KingfisherWebP
    • pod ‘KingfisherWebP’

詳細了解Xcode單元測試

/—/

/– 課時21)面向協議編程、響應式編程 –/

協議用途:
利用協議實現前綴效果

extension MJ where Base == Person {} // Base只能是Person類型才能得到這個擴展 extension MJ where Base : Person {} // Person及其子類都能得到這個擴展 // 前綴類型 struct MJ<Base> {var base: Baseinit(_ base: Base) {self.base = base} } // 利用協議擴展前綴屬性 protocol MJCompatible {} extension MJCompatible {var mj: MJ<Self> {set {} // 此處加上set是為了mutating的語法能編譯通過get { MJ(self) }}static var mj: MJ<Self>.Type {set {} // 此處加上set是為了mutating的語法能編譯通過get { MJ<Self>.self }} } // 給字符串擴展功能,讓String擁有mj前綴屬性 extension String: MJCompatible {} // 給 String.mj 或者 String().mj 前綴擴展功能 extension MJ where Base == String {var numberCount: Int {var count = 0for c in base where ("0"..."9").contains(c) {count += 1}return count}mutating func run() {}static func test() {} } var str = "test_str" str.mj.run() // 此處不能"test_str".mj.run(),因為"test_str"是一個常量,無法調用mutating修飾的函數class Person {} extension Person: MJCompatible {}class Dog {} extension Dog: MJCompatible {}

利用協議實現類型判斷

響應式編程

  • 響應式編程(Reactive Programming,簡稱RP)
    • 也是一種編程范式,于1997年提出,可以簡化異步編程,提供更優雅的數據綁定
    • 一般與函數式融合在一起,所以也會叫做:函數響應式編程(Functional Reactive Programming,簡稱FRP)
  • 比較著名的、成熟的響應式框架
    • ReactiveCocoa
      • 簡稱RAC,有Objective-C、Swift版本
      • 官網:http://reactivecocoa.io/
      • GitHub:https://github.com/ReactiveCocoa
    • ReactiveX(建議使用這個)
      • 簡稱Rx,有眾多編程語言的版本,比如RxJava、RxKotlin、RxJS、RxCpp、RxPHP、RxGo、RxSwift等等
      • 官網:http://reactivex.io/
      • GitHub:https://github.com/ReactiveX

RxSwift

  • RxSwift(ReactiveX for Swift),是ReactiveX的Swift版本
    • 源碼:https://github.com/ReactiveX/RxSwift
    • 中文文檔:https://beeth0ven.github.io/RxSwift-Chinese-Documentation/
  • RxSwift的github上已經有詳細的安裝教程,這里只演示CocoaPods方式的安裝
// ① Podfile pod 'RxSwift', '~>5' pod 'RxCocoa', '~>5' // ② 命令行 pod repo update pod install // ③ 導入模塊 import RxSwift import RxCocoa
  • 模塊說明
    • RxSwift:Rx標準API的Swift實現,不包括任何iOS相關的內容
    • RxCocoa:基于RxSwift,給iOS UI控件擴展了很多Rx特性

RxSwift的核心角色

  • Observable:負責發送事件(Event)
  • Observer:負責訂閱Observable,監聽Observable發送的事件(Event)
public enum Event<Element> {/// Next element is produced.case next(Element)/// Sequence terminated with an error.case error(Swift.Error)/// Sequence completed successfullycase completed }
  • Event有3種
    • next:攜帶具體數據
    • error:攜帶錯誤信息,表明Observable終止,不會再發出事件
    • completed:表明Observable終止,不會再發出事件

創建、訂閱Observable1
創建、訂閱Observable2

Disposable

  • 每當Observable被訂閱時,都會返回一個Disposable實例,當調用Disposable的dispose,就相當于取消訂閱
  • 在不需要再接收事件時,建議取消訂閱,釋放資源,有3種常見方式取消訂閱

創建Observer的兩種方式(video 6373s)

/—/

/– 課時20)函數式編程、面向協議編程 –/

函數式編程(Funtional Programming)

  • 函數式編程(Funtional Programming,簡稱FP)是一種編程范式,也就是如何編寫程序的方法論
    • 主要思想:把計算過程盡量分解成一系列可復用函數的調用
    • 主要特征:函數是“第一等公民”
      • 函數與其他數據類型一樣的地位,可以賦值給其他變量,也可以作為函數參數、函數返回值
  • 函數式編程最早出現在LISP語言,絕大部分的現代編程語言也對函數式編程做了不同程度的支持,比如
    • Haskell、JavaScript、Python、Swift、Kotlin、Scala等
  • 函數式編程中幾個常用的概念
    • Higher-Order Function、Function Currying
    • Functor、Applicative Functor、Monad
  • 參考資料
    • https://adit.io/posts/2013-04-17-functors,_appclatives,_and_monads_in_pictures.html
    • http://www.mokacoding.com/blog/functor-applicative-monads-in-pictures

FP實踐 - 傳統寫法

// 假設要實現一下功能: [(num + 3) * 5 - 1] % 10 / 2 let num = 1func add(_ v1: Int, _ v2: Int) -> Int { v1 + v2 } func sub(_ v1: Int, _ v2: Int) -> Int { v1 - v2 } func multiple(_ v1: Int, _ v2: Int) -> Int { v1 * v2 } func divide(_ v1: Int, _ v2: Int) -> Int { v1 / v2 } func mod(_ v1: Int, _ v2: Int) -> Int { v1 % v2 }divide(mod(sub(multiple(add(num, 3), 5), 1), 10), 2)

FP實踐 - 函數式寫法

let num = 1 func add(_ v: Int) -> (Int) -> Int { { $0 + v } } func sub(_ v: Int) -> (Int) -> Int { { $0 - v } } func multiple(_ v: Int) -> (Int) -> Int { { $0 * v } } func divide(_ v: Int) -> (Int) -> Int { { $0 / v } } func mod(_ v: Int) -> (Int) -> Int { { $0 % v } } // 函數合成 infix operator >>> : AdditionPrecedence func >>><A, B, C>(_ f1: @escaping (A) -> B,_ f2: @escaping (B) -> C) -> (A) -> C { { f2(f1($0)) } } var fn = add(3) >>> multiple(5) >>> sub(1) >>> mod(10) >>> divide(2) fn(num)

高階函數(Higher-Oder Function)

  • 高階函數是至少滿足下列一個條件的函數
    • 接受一個或多個函數作為輸入(mpa、filter、reduce等)
    • 返回一個函數
  • FP中到處都是高階函數
func add(_ v: Int) -> (Int) -> Int { { $0 + v } }

柯里化(Currying)

  • 什么是柯里化
    • 將一個接受多參數的函數變換為一系列只接受單個參數的函數
  • Array、Optional的map方法接收的參數就是一個柯里化函數
  • 例子,將已有函數柯里化
    • 例子1
// v3 == 30 func add2(_ v3: Int) -> (Int) -> (Int) -> Int {// v2 == 20return { v2 in// v1 == 10return { v1 inreturn v1 + v2 + v3}} } print(add2(30)(20)(10))
  • 例子2
func add1(_ v1: Int, _ v2: Int) -> Int { v1 + v2 } func add2(_ v1: Int, _ v2: Int, _ v3: Int) -> Int { v1 + v2 + v3 } // 將上面兩個函數柯里化 func currying<A, B, C>(_ fn: @escaping (A, B) -> C) -> (B) -> (A) -> C {{ b in { a in fn(a, b) } } // 閉包表達式 } func currying<A, B, C, D>(_ fn: @escaping (A, B, C) -> D) -> (C) -> (B) -> (A) -> D {{ c in { b in { a in fn(a, b, c) } } } } let curriedAdd1 = currying(add1) print(curriedAdd1(10)(20)) let curriedAdd2 = currying(add2) print(curriedAdd2(10)(20)(30))

提示:如果一個函數需要接收4個以上的參數,就需要思考函數的是否存在設計上的Bug,并思考如何減少參數

函子(Functor)

  • 像Array、Optional這樣支持map運算的類型,稱為函子(Functor)
// Array<Element> public func map<T>(_ transform: (Element) -> T) -> Array<T>// Optional<Wrapped> public func map<U>(_ transform: (Wrapped) -> U) -> Optional<U>

適用函子(Applicative Functor)

  • 對任意一個函子 F , 如果能支持以下運算,該函子就是一個適用函子
func pure<A>(_ value: A) -> F<A> func <*><A, B>(fn: F<A -> B>, value: F<A>) -> F<B>
  • Optional可以成為適用函子
func pure<A>(_ value: A) -> A? { value } infix operator <*> : AdditionPrecedence func <*><A, B>(fn: ((A) -> B)?, value: A?) -> B? {guard let f = fn, let v = value else { return nil }return f(v) } var value: Int? = 10 var fn: ((Int) -> Int)? = { $0 * 2 } // Optional(20) print(fn <*> value as Any)
  • Array可以成為適用函子
func pure<A>(_ value: A) -> [A] { [value] } func <*><A, B>(fn: [(A) -> B], value: [A]) -> [B] {var arr: [B] = []if fn.count == value.count {for i in fn.startIndex..<fn.endIndex {arr.append(fn[i](value[i]))}}return arr } print(pure(10)) var arr = [{ $0 * 2 },{ $0 + 10 }, { $0 - 5 }] <*> [1, 2, 3] print(arr)

單子(Monad)

  • 對任意一個類型 F,如果能支持以下運算,那么就可以稱為是一個單子(Monad)
func pure<A>(_ value: A) -> F<A> func flatMap<A, B>(_ value: F<A>, _ fn: (A) -> F<B>) -> F<B>
  • 很顯然,Array、Optional都是單子

面向協議編程

  • 面向協議編程(Protocol Oriented Programming,簡稱POP)
    • 是Swift的一種編程范式,Apple于2015年WWDC提出
    • 在Swift標準庫中,能見到大量POP的影子
  • 同時,Swift也是一門面向對象的編程語言(Object Oriented Programming,簡稱OOP)
    • 在Swift開發中,OOP和POP是相輔相成的,任何一方并不能取代另一方
  • POP能彌補OOP一些設計上的不足

回顧OOP

  • OOP的三大特性:封裝、繼承、多態
    • 當多個類(比如A、B、C類)具有很多共性時,可以將這些共性抽取到一個父類中(比如D類),最后A、B、C類繼承D類

OOP的不足

  • 但有些問題,使用OOP并不能很好解決,比如
    • 如何將BVC(繼承UIViewController)、DVC(UITableViewController)的公共方法run抽取出來?
  • 基于OOP想到的一些解決方案
    • 1、將run方法放到另一個對象A中,然后BVC、DVC擁有對象A屬性
      • 多來一些額外的依賴關系
    • 2、將run方法添加到UIViewController分類中
      • UIViewController會越來越臃腫,而且會影響它的其他所有子類
    • 3、將run方法抽取到新的父類,采用多集成?(C++支持多繼承)
      • 會增加程序設計復雜度,產生菱形繼承等問題,需要開發者額外解決

POP的解決方案

  • 首先添加protocol,然后給protocol擴展一個方法實現,最后讓其使用了該方法的對象添加這個擴展即可

POP的注意點

  • 優先考慮創建協議,而不是父類(基類)
  • 優先考慮值類型(struct、enum),而不是引用類型(class)
  • 巧用協議的擴展功能
  • 不要為了面向協議而使用協議

/—/

/– 課時19)從OC到Swift、函數式編程 –/

課前補充:

  • 0 Substring
    • Substring 發生修改 或者 轉為String時,會重新分配新的內存存儲字符串數據
  • 1 String 無法橋接轉換成 NSMutableString
    • 但是,Swift可以通過 NSMutableString(string: “string content”) 創建一個NSMutableString對象
  • 2 class Car: NSObject的內存結構
    • 內存結構是isa指針和對象中的屬性

只能被class繼承的協議

protocol Runnable1: AnyObject {} protocol Runnable2: class {} @objc protocol Runnable3 {} // 以上協議只能被類去遵守,結構體和枚舉都無法遵守
  • 被 @objc 修飾的協議,還可以暴露給OC去遵守實現

可選協議

  • 可以通過 @objc 定義可選協議,這種協議只能被class遵守

dynamic

  • 被 @objc dynamic 修飾的內容會具有動態性,比如調用方法會走runtime那一套流程

KVC\KVO

  • Swift支持KVC\KVO的條件
    • 屬性所在的類、監聽器最終繼承自NSObject
    • 用 @objc dynamic 修飾對應的屬性

block方式的KVO

  • 可以使用Swift的閉包監聽內容的修改
class Person: NSObject {@objc dynamic var age: Int = 0var observation: NSKeyValueObservation?override init() {super.init()observation = observe(\Person.age, options: .new) { (person, change) inprint(change.newValue as Any)}} } var p = Person() p.age = 20 p.setValue(25, forKey: "age")

關聯對象(Associated Object)

  • 在Swift中,class依然可以使用關聯對象
  • 默認情況,extension不可以增加存儲屬性
    • 借助關聯對象,可以實現類似extension為class增加存儲屬性的效果
class Person {} extension Person {private static var AGE_KEY: Void? // Bool類型和Void?類型在內存中都是只占用一個字節的var age: Int {get {objc_getAssociatedObject(self, &Self.AGE_KEY) as? Int ?? -1024}set {objc_setAssociatedObject(self, &Self.AGE_KEY, newValue, .OBJC_ASSOCIATION_ASSIGN)}} } var p = Person() p.age = 1024 print(p.age)

資源名管理

  • 有一種做法實際上是參考了Android的資源名管理方式

資源名管理還有其他思路

  • 更多優秀的思路參考
    • https://github.com/mac-cain13/R.swift
    • https://github.com/SwiftGen/SwiftGen

多線程開發 - 異步

class demo {public typealias Task = () -> Voidpublic static func async(_ task: @escaping Task) {_async(task)}public static func async(_ task: @escaping Task,_ mainTask: @escaping Task) {_async(task, mainTask)}private static func _async(_ task: @escaping Task,_ mainTask: Task? = nil) {let item = DispatchWorkItem(block: task)DispatchQueue.global().async(execute: item)if let main = mainTask {item.notify(queue: DispatchQueue.main, execute: main)}} }

小提示:使用Swift開發時,當加上NS前綴無法得到對象的時候,可以嘗試將NS前綴去掉,就可以得到之前在OC使用過的類

多線程開發 - 延遲

@discardableResult public static func delay(_ seconds: Double,_ block: @escaping Task) -> DispatchWorkItem {let item = DispatchWorkItem(block: block)DispatchQueue.main.asyncAfter(deadline: DispatchTime.now(),execute: item)return item }

多線程開發 - 異步延遲

private static func _asyncDelay(_ seconds: Double,_ task: @escaping Task,_ mainTask: Task? = nil) -> DispatchWorkItem {let item = DispatchWorkItem(block: task)DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + seconds,execute: item)if let main = mainTask {item.notify(queue: DispatchQueue.main, execute: main)}return item // 返回的item可以調用item.cancel()取消延遲執行的任務 }

多線程開發 - once

  • dispatch_once在Swift中已被廢棄,取而代之
    • 可以用 類型屬性 或者 全局變量\常量
    • 默認自帶 lazy + dispatch_once 效果

多線程開發 - 加鎖

  • gcd信號量(使用DispatchSemaphore加鎖)
  • Foundation(使用NSRecursiveLock加鎖)

思考:在Swift中,什么時候使用結構體,什么時候使用類?

函數式編程

Array的常見操作

lazy的優化

  • array.lazy.map 可以使其元素用到時才去調用閉包函數

Optional的map和flatMap

  • 對于可選類型使用map或flatMap,它是一個整體
  • flatMap發現如果本身就是可選類型就不會再包裝一次。

if a>0 && b>0
等價于
if a>0, b>0

/—/

/– 課時18)從OC到Swift –/

課前回顧

  • .catch { error } : error是默認自帶的
  • #warning(“undo”)
  • 編碼習慣

iOS程序的入口

  • 在AppDelegate上面默認有個@UIApplicationMain標記,這表示
    • 編譯器自動生成入口代碼(main函數代碼),自動設置AppDelegate為APP的代理
  • 也可以刪掉@UIApplicationMain,自定義入口代碼:新建一個main.swift文件(文件名只能是main.swift)

Swift調用OC

  • 新建1個橋接頭文件,文件名格式默認為:{targetName}-Bridging-Header.h(targetName一般為項目名稱)
  • 在{targetName}-Bridging-Header.h 文件中 #import OC需要暴露給Swift的內容
  • 如果C語言暴露給Swift的函數名跟Swift中的其他函數名沖突了
    • 可以在Swift中使用 @_silgen_name 修改C函數名

OC調用Swift

  • Xcode已經默認生成一個用于OC調用Swift的頭文件,文件名格式是:{targetName}-Swift.h
  • Swift暴露給OC的類最終繼承自NSObject
  • 使用 @objc 修飾需要暴露給OC的成員
  • 使用 @objcMembers 修飾類
    • 代表默認所有成員都會暴露給OC(包括擴展中定義的成員)
    • 最終是否成功暴露,還需要考慮成員自身的訪問級別
  • Xcode會根據Swift代碼生成對應的OC聲明,寫入 {targetName}-Swift.h 文件
  • 可以通過 @objc 重命名Swift暴露給OC的符號名(類名、屬性名、函數名等)

選擇器(Selector)

  • Swift中依然可以使用選擇器,使用 #selector(name) 定義一個選擇器
    • 必須是被 @objcMembers 或 @objc 修飾的方法才可以定義選擇器

補充:

  • 純Swift是沒有runtime的
  • runtime只存在在OC中
  • dynamic關鍵字修飾的函數,是使用runtime機制去執行的

問題:

  • 1、為什么Swift暴露給OC的類最終要繼承自NSObject?
    • 因為OC需要執行一些runtime的函數得到isa指針,而只有繼承自NSObject才能夠執行runtime函數
  • 2、(p as Person).run()底層是怎么調用的?反之,OC調用Swift底層有時如何調用?
    • 純OC類暴露給Swift使用,其底層還是使用runtime機制
    • OC調用Swift底層也是使用runtime機制
  • 3、在Swift文件中,暴露給OC使用的類,依然在Swift中使用并執行 car.run() 底層是怎么調用的?
    • 其底層依然是用Swift的虛表機制

String

  • Swift的字符串類型String,跟OC的NSString,在API設計上還是有較大差異
  • String的插入和刪除方法

Substring

  • String可以通過下標、prefix、suffix等截取子串、子串類型不是String,而是Substring
  • Substring和它的base,共享字符串數據
  • Substring轉為String時,會重新分配新的內存存儲字符串數據

String 與 Character

for c in "jack" { // c是Character類型print(c) }var str = "jack" // c是Character類型 var c = str[str.startIndex]

String相關的協議

  • BidirectionalCollection 協議包含的部分內容
    • startIndex、endIndex屬性、index方法
    • String、Array 都遵守了這個協議
  • RangeReplaceableCollection 協議包含的部分內容
    • append、insert、remove方法
    • String、Array都遵守了這個協議
  • Dictionary、Set 也有實現上述協議中聲明的一些方法,只是并沒有遵守上述協議

多行String

let str = """ 1"2" 3'4' """

String 與 NSString

  • String 與 NSString 之間可以隨時隨地橋接轉換
    • 如果你覺得String的API過于復雜難用,可以考慮將String轉為NSString
  • String 不能 橋接轉換成 NSMutableString。反之,NSMutableString可以橋接轉換成String,因為NSMutableString繼承自NSString
  • 比較字符串內容是否等價
    • String使用 == 運算符
    • NSString使用isEqual方法,也可以使用 == 運算符(本質還是調用了isEqual方法)

Swift、OC橋接轉換表:

  • String <-> NSString
  • String <- NSMutableString
  • Array <-> NSArray
  • Array <- NSMutableArray
  • Dictionary <-> NSDictionary
  • Dictionary <- NSMutableDictionary
  • Set <-> NSSet
  • Set <- NSMutableSet

/—/

/– 課時17)字面量協議、模式匹配、條件編譯 –/

字面量(Literal)

var age = 10 var isRed = false var name = "Jack"
  • 上面代碼中的10、false、"Jack"就是字面量
  • 常見字面量的默認類型
    • public typealias IntegerLiteralType = Int
    • public typealias FloatLiteralType = Double
    • public typealias BooleanLiteralType = Bool
    • public typealias StringLiteralType = String
// 可以通過typealias修改字面量的默認類型 typealias FloatLiteralType = Float typealias IntegerLiteralType = UInt8 var age = 10 // UInt8 var height = 1.68 // Float // 一般情況不建議對其進行修改,只需要知道有此功能即可
  • Swift自帶的絕大部分類型,都支持直接通過字面量進行初始化
    • Bool、Int、Float、Double、String、Array、Dictionary、Set、Optional等

字面量協議

  • Swift自帶類型之所以能夠通過字面量初始化,是因為它們遵守了對應的協議
    • Bool:ExpressibleByBooleanLiteral
    • Int:ExpressibleByIntegerLiteral
    • Float、Double:ExpressibleByIntegerLiteral、ExpressibleByFloatLiteral
    • Dictionary:ExpressibleByDictionaryLiteral
    • String:ExpressibleByStringLiteral
    • Array、Set:ExpressibleByArrayLiteral
    • Optional:ExpressibleByNilLiteral

字面量協議應用

extension Int : ExpressibleByBooleanLiteral {public init(booleanLiteral value: Bool) {self = value ? 1 : 0} } var num: Int = true print(num) // 1
  • 有點類似于C++中的轉換構造函數
struct Point {var x = 0.0, y = 0.0 }extension Point : ExpressibleByArrayLiteral, ExpressibleByDictionaryLiteral {init(arrayLiteral elements: Double...) {guard elements.count > 0 else {return}self.x = elements[0]guard elements.count > 1 else {return}self.y = elements[1]}init(dictionaryLiteral elements: (String, Double)...) {for (k, v) in elements {if k == "x" {self.x = v}else if k == "y" {self.y = v}}} }var p: Point = [10.5, 20.5] print(p) p = ["x": 11, "y": 22] print(p)

模式(Pattern)

  • 什么是模式?
    • 模式是用于匹配規則,比如switch的case、捕捉錯誤的catch、if\guard\while\for語句的條件等

Swift中的模式有

  • 通配符模式(wildcard Pattern)

    • _ 匹配任何值
    • _? 匹配非nil值
  • 標示符模式(Identifier Pattern)

    • 給對應的變量、常量名賦值
  • 值綁定模式(Value-Binding Pattern)

  • 元組模式(Tuple Pattern)

  • 枚舉Case模式(Enumeration Case Pattern)

    • if case語句等價于只有1個case的switch語句
    • for case語句
  • 可選模式(Optional Pattern)

  • 類型轉換模式(Type-Casting Pattern)

  • 表達式模式(Expression Pattern)

    • 表達式模式用在case中

自定義表達式模式

  • 可以通過重載運算符,自定義表達式模式的匹配規則
func isEven(_ i: Int) -> Bool { i % 2 == 0 } func isOdd(_ i: Int) -> Bool { i % 2 != 0 } extension Int {static func ~= (pattern: (Int) -> Bool, value: Int) -> Bool {pattern(value)} } var age = 9 switch age { case isEven:print(age, "是個偶數") case isOdd:print(age, "是個奇數") default: break }

where

  • 可以使用where為模式匹配增加匹配條件
var data = (10, "Jack") switch data { case let (age, _) where age > 10:print(data.1, "age>10") case let(age, _) where age > 0:print(data.1, "age>0") default:break } var ages = [10, 20, 44, 23, 55] for age in ages where age > 30 {print(age) } // 44 55

從OC到Swift

MARK、TODO、FIXME

  • // MARK:類似于OC中的 #pragma mark
  • // MARK: - 類似于OC中的 #pragma mark -
  • // TODO:用于標記未完成的任務
  • // FIXME:用于標記待修復的問題

條件編譯

系統版本檢測

if #available(iOS 10, macOS 10.12, *) {// 對于iOS平臺,只在iOS10及以上版本執行// 對于macOS平臺,只在macOS 10.12及以上版本執行// 最后的*表示在其他所有平臺都執行 }

API可用性說明

@available(iOS 10, macOS 10.15, *) class Person {}

/—/

/– 課時16)內存訪問沖突、指針 –/

局部作用域

  • 可以使用 do 實現局部作用域

逃逸閉包的注意點

  • 逃逸閉包不可以捕獲inout參數
typealias Fn = () -> () func other1(_ fn: Fn) { fn() } func other2(_ fn: @escaping Fn) { fn() } func test(value: inout Int) -> Fn {other1 { value += 1 }// error:逃逸閉包不能捕獲inout參數other2 { value += 1 }func plus() { value += 1 }// error:逃逸閉包不能捕獲inout參數return plus }

內存訪問沖突(Conflicting Access to Memory)

  • 內存訪問沖突會在兩個訪問滿足下列條件時發送:
    • 至少一個是寫入操作
    • 它們訪問的是同一塊內存
    • 它們的訪問時間重疊(比如在同一個函數內)
  • 如果下面的條件可以滿足,就說明重疊訪問結構體的屬性是安全的
    • 你只訪問實例存儲屬性,不是計算屬性或者類屬性
    • 結構體是局部變量而非全局變量
    • 結構體要么沒有被閉包捕獲,要么只被非逃逸閉包捕獲

指針

  • Swift中也有專門的指針類型,這些都被定性為“Unsafe”(不安全的),常見的有以下4種類型
    • UnsafePointer 類似于 const Pointee *
    • UnsafeMutablePointer 類似于 Pointee *
    • UnsafeRawPointer 類似于 const void *
    • UnsafeMutableRawPointer 類似于 void *

獲得某個變量的指針
獲得指向某個變量的指針
獲得指向堆空間實例的指針
創建指針
(以上四個知識點內容省略,詳情請查看視頻)

指針之間的轉換

var ptr = UnsafeMutableRawPointer.allocate(buteCount: 16, alignment: 1)ptr.assumingMemoryBound(to: Int.self).pointer = 11 (ptr + 8).assumingMemoryBound(to: Double.self).pointee = 22.0print(unsafeBitCast(ptr, to: UnsafePointer<Int>.self).pointee) print(unsafeBitCast(ptr + 8, to: UnsafePointer<Double>.self).pointee)ptr.deallocate()
  • unsafeBitCast是忽略數據類型的強制轉換,不會因為數據類型的變化而改變原來的內存數據
    • 類似于C++中的reinterpret_cast

/—/

/– 課時15)訪問控制、內存管理 –/

CustomStringConvertible

  • 遵守CustomStringConvertible、CustomDebugStringConvertible協議,都可以自定義實例的打印字符串
  • print調用的是CustomStringConvertible協議的description
  • debugPrin、po調用的是CustomDebugStringConvertible協議的debugDescription

Self

  • Self代表當前類型

assert(斷言)

  • 很多編程語言都有斷言機制:不符合指定條件就拋出運行時錯誤,常用于調試(Debug)階段的條件判斷
  • 默認情況下,Swift的斷言智慧在Debug模式下生效,Release模式下回忽略
  • 增加Swift Flags修改斷言的默認行為
    • -assert-config Release :強制關閉斷言
    • -assert-config Debug :強制開啟斷言

fatalError

  • 如果遇到嚴重問題,希望結束程序運行時,可以直接使用fatalError函數拋出錯誤(這是無法通過do-catch捕捉的錯誤)
    • 使用fatalError函數,就不需要再寫return
  • 在某些不得不實現、但不希望別人調用的方法,可以考慮內部使用fatalError函數

訪問控制(Access Control)

  • 在訪問權限控制這塊,Swift提供了5個不同的訪問級別(以下是從高到低排列,實體指被訪問級別修飾的內容)
    • open:允許在定義實體的模塊、其他模塊中訪問,允許其他模塊進行繼承、重寫(open只能用在類、類成員上)
    • public:允許在定義實體的模塊、其他模塊中訪問,不允許其他模塊進行繼承、重寫
    • internal:只允許在定義實體的模塊中訪問,不允許在其他模塊中訪問
    • fileprivate:只允許在定義實體的源文件中訪問
    • private:只允許在定義實體的封閉聲明中訪問
    • (總結:Swift的訪問是以文件、模塊為訪問單位的)
  • 絕大部分實體默認都是internal級別

訪問級別的使用準則

  • 一個實體不可以被更低訪問級別的實體定義,比如
    • 變量\常量類型 ≥ 變量\常量
    • 參數類型、返回值類型 ≥ 函數
    • 父類 ≥ 子類
    • 父協議 ≥ 子協議
    • 原類型 ≥ typealias
    • 原始值類型、關聯值類型 ≥ 枚舉類型
    • 定義類型A時用到的其他類型 ≥ 類型A
    • ……

元組類型

  • 元組類型的訪問級別是所有成員類型最低的那個

泛型類型

  • 泛型類型的訪問級別是類型的訪問級別以及所有泛型類型參數的訪問級別中最低的那個

成員、嵌套類型

  • 類型的訪問級別會影響成員(屬性、方法、初始化器、下標)、嵌套類型的默認訪問級別
    • 一般情況下,類型為private或fileprivate,那么成員\嵌套類型默認也是private或fileprivate
    • 一般情況下,類型為internal或public,那么成員\嵌套類型默認是internal
    • 子類重寫的成員訪問級別必須 ≥ 父類的成員訪問級別
    • 直接在全局作用域下定義的private等價于fileprivate

getter、setter

  • getter、setter默認自動接收它們所屬環境的訪問級別
  • 可以給setter單獨設置一個比getter更低的訪問級別,用以限制寫的權限

初始化器

  • 如果一個public類想在另一個模塊調用編譯生成的默認無參初始化器,必須顯式提供public的無參初始化器
    • 因為public類的默認初始化器是internal級別
  • required初始化器 ≥ 它的默認訪問級別
  • 如果結構體有private\fileprivate的存儲實例屬性,那么它的成員初始化器也是private\fileprivate
    • 否則默認就是internal

枚舉類型的case

  • 不能給enum的每個case單獨設置訪問級別
  • 每個case自動接收enum的訪問級別
    • public enum定義的case也是public

協議

  • 協議中定義的要求自動接收協議的訪問級別,不能單獨設置訪問級別
    • public協議定義的要求也是public
  • 協議實現的訪問級別必須 ≥ 類型的訪問級別,或者 ≥ 協議的訪問級別

擴展

  • 如果有顯式設置擴展的訪問級別,擴展添加的成員自動接收擴展的訪問級別
  • 如果沒有顯式設置擴展的訪問級別,擴展添加的成員的默認訪問級別,跟直接在類型中定義的成員一樣
  • 可以單獨給擴展添加的成員設置訪問級別
  • 不能給用于遵守協議的擴展顯式設置擴展的訪問級別
  • 在用一文件中的擴展,可以寫成類似多個部分的類型聲明
    • 在原本的聲明中的聲明一個私有成員,可以在同一文件的擴展中訪問它
    • 在擴展中聲明一個私有成員,可以在同一文件的其他擴展中、原本聲明中訪問它
public class Person {private func run0() {}private func eat0() {run1()} } // 擴展一 extension Person {private func run1() {}private func eat1() {run0()} } // 擴展二 extension Person {private func eat2() {run1()} } // 總結,擴展相當于將擴展的內容追加到類后面。

將方法賦值給var\let

  • 方法也可以像函數那樣,賦值給一個let或者var

內存管理

  • 跟OC一樣,Swift也是采取基于引用計數的ARC內存管理方案(針對堆空間)
  • Swift的ARC中有3種引用
    • 強引用(strong reference):默認情況下,引用都是強引用
    • 弱引用(weak reference):通過weak定義弱引用
      • 必須是可選類型的var,因為實例銷毀后,ARC會自動將弱引用設置為nil
      • ARC自動給弱引用設置nil時,不會觸發屬性觀察器
    • 無主引用(unowned reference):通過unowned定義無主引用
      • 不會產生強引用,實例銷毀后仍然存儲著實例的內存地址(類似于OC的 unsafe_unretained )
      • 試圖在實例銷毀后訪問無主引用,會產生運行時錯誤(野指針)
        (Fatal error: Attempted to read an unowned reference but object 0x0 was already deallocated)

weak、unowned的使用限制

  • weak、unowned只能用在類實例上面

Autoreleasepool

public func autoreleasepool<Result>(invoking body: () throws -> Result) rethrows -> Result // 閉包調用 autoreleasepool {let p = MJPerson(age:20, name: "Jack")p.run() }

循環引用(Reference Cycle)

  • weak、unowned都能解決循環引用的問題,unowned要比weak少一些性能消耗
    • 在生命周期中可能會變為nil的使用weak
    • 初始化賦值后再也不會變為nil的使用unowned

閉包的循環引用

  • 閉包表達式默認會對用到的外層對象產生額外的強引用(對外層對象進行了retain操作)
  • 下面代碼會產生循環引用,導致Person對象無法釋放(看不到Person的deinit被調用)
class Person {var fn: (() -> ())?func run() { print("run") }deinit { print("deinit") } } func test() {let p = Person()p.fn = { p.run() } } test()
  • 在閉包表達式的捕獲列表聲明weak或unowned引用,解決循環引用問題
// 第一種 p.fn = {[weak p] in p?.run() } // 第二種 p.fn = {[unowned p] in p.run() } // 第三種 p.fn = {[weak wp = p, unowned up = p, a = 10 + 20] inwp?.run() }
  • 如果想在定義閉包屬性的同時引用self,這個閉包必須是lazy的(因為在實例初始化完畢之后才能引用self)
class Person {lazy var fn: (() -> ()) = {[weak self] inself?.run()}func run() { print("run") }deinit { print("deinit") } }
  • 左邊的閉包fn內部如果用到了實例成員(屬性、方法)
    • 編譯器會強制要求明確寫出self
  • 如果lazy屬性是閉包調用的結果,那么不用考慮循環引用的問題(因為閉包調用后,閉包的生命周期就結束了)
class Person {var age: Int = 0lazy var getAge: Int = {self.age}()deinit { print("deinit") } }

@escaping

  • 非逃逸閉包、逃逸閉包,一般都是當做參數傳遞給函數
  • 非逃逸閉包:閉包調用發生在函數結束前,閉包調用在函數作用域內
  • 逃逸閉包:閉包有可能在函數結束后調用,閉包調用逃離了函數的作用域,需要通過@escaping聲明
import Dispatch typealias Fn = () -> () class Person {var fn: Fn// fn是逃逸閉包init(fn: @escaping Fn) {self.fn = fn}func run() {// DispatchQueue.global().async 也是一個逃逸閉包// 它用到了實例成員(屬性、方法),編譯器會強制要求明確寫出selfDispatchQueue.global().async {self.run()}} }

(課后研究:什么是Swift捕獲列表?Swift的DispatchQueue詳情?)

/—/

/– 課時14)可選項的本質、運算符重載、擴展 –/

可選項的本質

  • 可選項的本質是enum類型
var age: Int? = .none age = 10 switch age {case let v?:print("some", v)case nil:print("none") } switch age {case let .some(v):print("some", v)case .none:print("none") } var age_: Int? = 10 var age: Int?? = age_ age = nil // 等價于 var age0 = Optional.some(Optional.some(10)) age0 = .none var age1: Optional.<Optional> = .some(.some(10)) age1 = .none // 以下兩種方式聲明也是等價的 var age: Int?? = 10 var age0: Optional<Optional> = 10

溢出運算符(Overflow Operator)

  • Swift的算數運算符出現溢出時會拋出運行時錯誤
  • Swift有溢出運算符(&+、&-、&*),用來支持溢出運算

運算符重載(Operator Overload)

  • 類、結構體、枚舉可以為現有的運算符提供自定義的實現,這個操作叫做:運算符重載
struct Point {var x: Int, y: Intstatic func + (p1: Point, p2: Point) -> Point {Point(x: p1.x + p2.x, y: p1.y + p2.y}// 還有以下幾種定義方式static prefix func - (p: Point) -> Point {Point(x: -p.x, y: -p.y)}static func += (p1: inout Point, p2: Point) -> Point {p1 = p1 + p2}static prefix func ++ ……static postfinx func ++ ……static func == (p1: Point, p2: Point) -> {(p1.x == p2.x) && (p1.y == p2.y)} } let p = Point(x:10, y:20) + Point(x: 11, y:22) print(p) // Point(x: 21, y: 42)

Equatable

  • 要想得知2個實例是否等價,一般做法是遵守Equatable協議,重載 == 運算符
    • 與此同時, 等價于重載了 != 運算符
struct Point : Equatable {var x: Int, y: Int } var p1 = Point(x: 10, y: 20) var p2 = Point(x: 11, y: 22) print(p1 == p2) // false print(p1 != p2) // true
  • Swift為以下類型提供默認Equatable實現
    • 沒有關聯類型的枚舉
    • 只擁有遵守Equatable協議關聯類型的枚舉
    • 只擁有遵守Equatable協議存儲屬性的結構體
  • 引用類型比較存儲的地址值是否相等(是否引用著同一個對象),使用恒等運算符===、!==

Comparable

  • 要想比較2個實例的大小,一般做法是:
    • 遵守Comparable協議
    • 重載相應的運算符
// score大的比較大,若score相等,age小的比較大 struct Student : Comparable {var age: Intvar score: Intinit(score: Int, age: Int) {self.score = scoreself.age = age}static func < (lhs: Student, rhs: Student) -> Bool {(lhs.score < rhs.score) || (lhs.score == rhs.score && lhs.age > rhs.age)}static func > (lhs: Student, rhs: Student) -> Bool {(lhs.score > rhs.score) || (lhs.score == rhs.score && lhs.age < rhs.age)}static func <= (lhs: Student, rhs: Student) -> Bool {!(lhs > rhs)}static func >= (lhs: Student, rhs: Student) -> Bool {!(lhs < rhs)} }

自定義運算符(Custom Operator)

  • 可以自定義新的運算符:在全局作用域使用operator進行聲明
prefix operator 前綴運算符 postfix operator 后綴運算符 infix operator 中綴運算符 : 優先級組precedencegroup 優先級組 {associativity: 結合性(left\right\none)higherThan: 比誰的優先級高lowerThan: 比誰的優先級低assignment: true代表在可選鏈操作中擁有跟賦值運算符一樣的優先級 }prefix operator +++ infix operator +- : PlusMinusPrecedence precedencegroup PlusMinusPrecedence {associativity: nonehigherThan: AdditionPrecedencelowerThan: MultiplicationPrecedenceassignment: true }

擴展(Extension)

  • Swift中的擴展,有點類似于OC中的分類(Category)
  • 擴展可以為枚舉、結構體、類、協議添加新功能
    • 可以添加方法、計算屬性、下標、(便捷)初始化器、嵌套類型、協議等等
  • 擴展不能辦到的事情
    • 不能覆蓋原有的功能
    • 不能添加存儲屬性,不能向已有的屬性添加屬性觀察器
    • 不能添加父類
    • 不能添加指定初始化器,不能添加反初始化器
    • ……

初始化器

  • 如果希望自定義初始化器的同時,編譯器也能夠生成默認初始化器
    • 可以在擴展中編寫自定義初始化器
  • 類遵守協議實現的required初始化器,也不能寫在擴展中

協議

  • 如果一個類型已經實現了協議的所有要求,但是還沒有聲明它遵守了這個協議
    • 可以通過擴展來讓它遵守這個協議
  • 編譯一個函數,判斷一個整數是否為奇數?
// 第一種 func isOdd<T: BinaryInteger>(_ i: T) -> Bool {i % 2 != 0 } // 第二種 extension BinaryInteger {func isOdd() -> Bool {self % 2 != 0 } }
  • 擴展可以給協議提供默認實現,也間接實現「可選協議」的效果
  • 擴展可以給協議擴充「協議中從未聲明過的方法」
protocol TestProtocol {func test1() } extension TestProtocol {func test1() {print("TestProtocol test1") }func test2() {print("TestProtocol test2") } }

泛型

class Stack<E> {var elements = [E]() }
  • 擴展中依然可以使用原類型中的泛型類型
extension Stack {func top() -> E {elements.last!} }
  • 符合條件才擴展
extension Stack : Equatable where E : Equatable {static func == (left: Stack, right: Stack) -> Bool {left.elements == right.elements} }

/—/

/– 課時13)匯編分析String、Array底層 –/

關于String的思考

  • 1個String變量占用多少內存?
  • 下面2個String變量,底層存儲有什么不同?
var str1 = "0123456789" var str2 = "0123456789ABCDEF"
  • 內存地址從低到高分別是,代碼區->常量區->全局區(數據段)->堆空間->棧空間->動態庫
  • 如果對String進行拼接操作,String變量的存儲會發生什么變化?
str1.append("ABCDE") str1.append("F")str2.append("G")

Mach-O文件是Apple下的可執行文件

  • 從編碼到啟動APP
    • OC、Swift源碼通過編譯鏈接成Mach-O可以執行文件,然后啟動該文件。

dyld_stub_binder

  • 符號的延遲綁定通過dyld_stub_binder完成
  • jmpq *0xb31(%rip)格式的匯編指令
    • 占用6個字節

關于Array的思考

  • 1個Array變量占用多少內存?
    • 8個字節,并且該變量是一個地址值
  • 數組中的數據存放在哪里?
    • 堆空間中

/—/

/– 課時12)Error處理、泛型 –/

補充上節課知識

  • deinit
  • Person和Person.self

創建對象的方式

* var p0 = Person() * var p1 = Person.init() * var p2 = type(of: p0).init() * var p3 = Person.self() * var p4 = Person.self.init()

錯誤類型

  • 開發過程常見的錯誤
    • 語法錯誤(編譯報錯)
    • 邏輯錯誤
    • 運行時錯誤(可能會導致閃退,一般也叫做異常)

自定義錯誤

  • Swift中可以通過Error協議自定義運行時的錯誤信息
  • 函數內部通過throw拋出自定義Error,可能會拋出Error的函數必須加上throws聲明
  • 需要使用try調用可能會拋出Error的函數

do-catch

  • 可以使用do-catch捕捉Error
  • 拋出Error后,try下一句直到作用域結束的代碼都將停止運行

處理Error

  • 處理Error的2種方式
    • ① 通過do-catch捕捉Error
    • ② 不捕捉Error,在當前函數新增throws聲明,Error將自動拋給上層函數
  • 如果最頂層函數(main函數)依然沒有捕捉Error,那么程序將終止

try?、try!

  • 可以使用try?、try!調用可能會拋出Error的函數,這樣就不用去處理Error
  • a、b是等價的
var a = try? divide(20, 0)var b: Int? do{b = try divide(20, 0) } catch {}

rethrows

  • rethrows表明:函數本身不會拋出錯誤,但調用閉包參數拋出錯誤,那么它會將錯誤向上拋
func exec(_ fn: (Int, Int) throws -> Int, _ num1: Int, _ num2: Int) rethrows {print(try fn(num1, num2)) } // Fatal error: Error raised at top level try exec(divide, 20, 0)

defer

  • defer語句:用來定義以任何方式(拋錯誤、return等)離開代碼塊前必須要執行的代碼
    • defer語句將延遲至當前作用域結束之前執行
  • defer語句的執行順序與定義順序相反(也就是,先定義的后執行,后定義的先執行)

泛型(Generics)

  • 泛型可以將類型參數化,提高代碼復用率,減少代碼量
func swapValue<T>(_ a: inout T, _ b: inout T) {(a, b) = (b, a) }
  • 泛型函數賦值給變量
func test<T1, T2>(_ t1: T1, _ t2: T2) {} var fn: (Int, Double) -> () = test

關聯類型(Associated Type)

  • 關聯類型的作用:給協議中用到的類型定義一個占位名稱
  • 協議中可以擁有多個關聯類型
  • 協議中只能用關聯類型,因為泛型參數是用在類、結構體、枚舉、函數上的。
  • 可以使用 typealias Element = String 給關聯類型設定真實類型;也可以不指定,編譯器會自動識別器關聯類型

類型約束

protocol Runnable { } class Person { } func swapValues<T : Person & Runnable>(_ a: inout T, _ b: intou T) {(a, b) = (b, a) } protocol Stackable {associatedtype Element: Equatable } class Stack<E : Equatable> : Stackable { }

協議類型的注意點

  • 如果協議中有associatedtype
protocol Runnable {associatedtype Speedvar speed: Speed { get } } class Person : Runnable {var speed: Double { 0.0 } } class Car : Runnable {var speed: Int { 0 } }

泛型解決

  • 解決方案①:使用泛型

不透明類型(Opaque Type)

  • 解決方案②:使用some關鍵字聲明一個不透明類型
  • some限制只能返回一種類型

some

  • some除了用在返回值類型上,一般還可以用在屬性類型上

/—/

/– 課時11)init、deinit、可選鏈、協議、元類型 –/

required

  • 用required修飾指定初始化器,表明其所有子類都必須實現該初始化器(通過繼承或者重寫實現)(這里有一種情況是子類未寫任何初始化器也不報錯,原因是因為子類無任何初始化器時,會觸發自動繼承機制)
  • 如果子類重寫了required初始化器,也必須加上required,不用加override

屬性觀察器

  • 父類的屬性在它自己的初始化器中賦值不會觸發屬性觀察器,但在子類的初始化器中賦值會觸發屬性觀察器

可失敗初始化器

  • 類、結構體、枚舉都可以使用 init? 定義可失敗初始化器
  • 不允許同時定義參數標簽、參數個數、參數類型相同的可失敗初始化器和非可失敗初始化器
  • 可以用 init! 定義隱式解包的可失敗初始化器
  • 可失敗初始化器可以調用非可失敗初始化器,非可失敗初始化器調用可失敗初始化器需要進行解包
  • 如果初始化器調用一個可失敗初始化器導致初始化失敗,那么整個初始化過程都失敗,并且之后的代碼都停止執行
  • 可以用一個非可失敗初始化器重寫一個可失敗初始化器,但反過來是不行的

反初始化器(deinit)

  • deinit叫做反初始化器,類似于C++的析構函數、OC中的dealloc方法
  • 當類的實例對象被釋放內存時,就會調用實例對象的deinit方法
  • deinit不接受任何參數,不能寫小括號,不能自行調用
  • 父類的deinit能被子類繼承
  • 子類的deinit實現執行完畢后會調用父類的deinit

可選鏈(Optional Chaining)

  • 如果可選項為nil,調用方法、下標、屬性失敗,結果為nil
  • 如果可選項不為nil,調用方法、下標、屬性成功,結果會被包裝成可選項
    • 如果結果本來就是可選項,不會進行再次包裝
  • 多個 ? 可以鏈接在一起
    • 如果鏈中任何一個節點是nil,那么整個鏈就會調用失敗

協議(Protocol)

  • 協議可以用來定義方法、屬性、下標的聲明,協議可以被枚舉、結構體、類遵守(多個協議之間用逗號隔開)
  • 協議中定義方法時不能有默認參數值
  • 默認情況下,協議中定義的內容必須全部都實現
    • 也有辦法辦到只實現部分內容,以后的課程會講到

協議中的屬性

  • 協議中定義屬性時必須用var關鍵字
  • 實現協議時的屬性權限要不小于協議中定義的屬性權限
    • 協議定義get、set,用var存儲屬性或get、set計算屬性去實現
    • 協議定義get,用任何屬性都可以實現

static、class

  • 為了保證通用,協議中必須用static定義類型方法、類型屬性、類型下標

mutating

  • 只有將協議中的實例方法標記為mutating
    • 才允許結構體、枚舉的具體實現修改自身內存
    • 類在實現方法時不用加mutating,枚舉、結構體才需要加mutating

init

  • 協議中還可以定義初始化器init
    • 非final類實現時必須加上required
  • 如果從協議實現的初始化器,剛好是重寫了父類的指定初始化器
    • 那么這個初始化必須同時加required、override

init、init?、init!

  • 協議中定義的init?、init!,可以用init、init?、init!去實現
  • 協議中定義的init,可以用init、init!去實現

協議的繼承

  • 一個協議可以繼承其他協議

協議組合

protocol Livable { } protocol Runnable { } class Person { } // 接收Person或者其子類的實例 func fn0(obj: Person) { } // 接收遵守Livable協議的實例 func fn1(obj: Livable) { } // 接收同時遵守Livable、Runnable協議的實例 func fn2(obj: Livable & Runnable) { } // 接收同時遵守Livable、Runnable協議、并且是Person或者子類的實例 func fn3(obj: Person & Livable & Runnable) { } // 另一種,接收同時遵守Livable、Runnable協議、并且是Person或者子類的實例 typealias RealPerson = Person & Livable & Runnable func fn4(obj: RealPerson) { }
  • 協議組合,可以包含1個類類型(最多1個)

CaseIterable

  • 讓枚舉遵守CaseIterable協議,可以實現遍歷枚舉值

CustomStringConvertible

  • 遵守CustomStringConvertible協議,可以自定義實例的打印字符串

Any、AnyObject

  • Swift提供了2種特殊的類型:Any、AnyObject
    • Any:可以代表任意類型(枚舉、結構體、類,也包括函數類型)
    • AnyObject:可以代表任意類類型(在協議后面寫上:AnyObject代表只有類能遵守這個協議)

is、as?、as!、as

  • is用來判斷是否為某種類型,as用來做強制類型轉換

X.self、X.Type、AnyClass

  • X.self是一個元類型(metadata)的指針,metadata存放著類型相關信息(跟對象在堆空間存放的前8個字節是一樣的)
  • X.self屬于X.Type類型

元類型的應用

  • 從結果可以看得出來,Swift還有個隱藏的基類:Swift._SwiftObject

Self

  • Self一般用作返回值類型,限定返回值跟方法調用者必須是同一類型(也可以作為參數類型)
  • 如果Self用在類中,要求返回時調用的初始化器是required的

/—/

/– 課時10)匯編分析多態原理、init –/

Swift中多態的實現原理:類似于C++的虛表(虛函數表)
對象的前16個字節中,前8個是類型信息,后8個是引用技術

初始化器

  • 類、結構體、枚舉都可以定義初始化器
  • 類有2種初始化器:指定初始化器(designated initializer)、便捷初始化器(convenience initializer)
    • 每個類至少有一個指定初始化器,指定初始化器是類的主要初始化器
    • 默認初始化器總是類的指定初始化器
    • 類偏向于少量指定初始化器,一個類通常只有一個指定初始化器
  • 初始化器的相互調用規則
    • 指定初始化器必須從它的直系父類調用指定初始化器
    • 便捷初始化器必須從相同的類里調用另一個初始化器
    • 便捷初始化器最終必須調用一個指定初始化器

初始化器的相互調用

  • 這一套規則保證了
    • 使用任意初始化器,都可以完整地初始化實例

兩段式初始化

  • Swift在編碼安全方面是煞費苦心,為了保證初始化過程的安全,設定了兩段式初始化、安全檢查
  • 兩段式初始化
    • 第1階段:初始化所有存儲屬性
      • 外層調用指定\便捷初始化器
      • 分配內存給實例,但未初始化
      • 指定初始化器確保當前類定義的存儲屬性都初始化
      • 指定初始化器調用父類的指定初始化器,不斷向上調用,形成初始化器鏈
    • 第2階段:設置新的存儲屬性值
      • 從頂部初始化器往下,鏈中的每一個指定初始化器都有機會進一步定制實例
      • 初始化器現在能夠使用self(訪問、修改它的屬性,調用它的實例方法等等)
      • 最終,鏈中任何便捷初始化器都有機會定制實例以及使用self

安全檢查

  • 指定初始化器必須保證在調用父類初始化器之前,其所在類定義的所有存儲屬性都要初始化完成
  • 指定初始化器必須先調用父類指定初始化器,然后才能為繼承的屬性設置新值
  • 便捷初始化器必須先調用同類中的其他初始化器,然后再為任意屬性設置新值
  • 初始化器在第1階段初始化完成之前,不能調用任何實例方法、不能讀取任何實例屬性的值,也不能引用self
  • 直到第1階段結束,實例才算完全合法

重寫初始化器

  • 當重寫父類的指定初始化器時,必須加上override(即使子類的實現是便捷初始化器)
  • 如果子類寫了一個匹配父類便捷初始化器的初始化器,不用加上override
    • 因為父類的便捷初始化器永遠不會通過子類直接調用,因此,嚴格來說,子類無法重寫父類的便捷初始化器

自動繼承

  • ① 如果子類沒有自定義任何指定初始化器,它會自動繼承父類所有的指定初始化器
  • ② 如果子類提供了父類所有指定初始化器的實現(要么通過方式①繼承,要么重寫)
    • 子類自動繼承所有的父類便捷初始化器
  • ③ 就算子類添加了更多的便捷初始化器,這些規則仍然適用
  • ④ 子類以便捷初始化器的形式重寫父類的指定初始化器,也可以作為滿足規則②的一部分

/—/

/– 課時9)匯編分析類型屬性、方法、下標、繼承 –/

方法(Method)
枚舉、結構體、類都可以定義實例方法、類型方法

  • 實例方法(Instance Method):通過實例調用
  • 類型方法(Type Method):通過類型調用,用 static 或者 class 關鍵字定義
    self
  • 在實例方法中代表實例
  • 在類型方法中代表類型

mutating
結構體和枚舉是值類型,默認情況下,值類型的屬性不能被自身的實例方法修改

  • 在func關鍵字前加mutating可以允許這種修改行為

@discardableResult
在func前面加個@discardableResult,可以消除:函數調用后返回值未被使用的警告

下標(subscript)
使用subscript可以給任意類型(枚舉、結構體、類)增加下標功能,有些地方也翻譯為:下標腳本

  • subscript的語法類似于實例方法、計算屬性、本質就是方法(函數)
  • subscript中定義的返回值類型決定了
    • get方法的返回值類型
    • set方法中newValue的類型
  • subscript可以接受多個參數,并且類型任意

下標的細節

  • subscript可以沒有set方法,但必須要有get方法
  • 如果只有get方法,可以省略get
  • 可以設置參數標簽(例子:p[index: 1])
  • 下標可以是類型方法

了解下:
結構體、類作為返回值對比;
接收多個參數的下標;

繼承(Inheritance)
值類型(枚舉、結構體)不支持繼承,只有類支持繼承
沒有父類的類,稱為:基類

  • Swift并沒有像OC、Java那樣的規定:任何類最終都要繼承子某個基類
  • 子類可以重寫父類的下標、方法、屬性,重寫必須加上override關鍵字

內存結構
重寫實例方法、下標

重寫類型方法、下標

  • 被class修飾的類型方法、下標,允許被子類重寫
  • 被static修飾的類型方法、下標、不允許被子類重寫

重寫屬性

  • 子類可以將父類的屬性(存儲、計算)重寫為計算屬性
  • 子類不可以將父類屬性重寫為存儲屬性
  • 只能重寫var屬性,不能重寫let屬性
  • 重寫時,屬性名、類型要一致
  • 子類重寫后的屬性權限不能小于父類屬性的權限
    • 如果父類屬性是只讀的,那么子類重寫后的屬性可以是只讀的、也可以是可讀寫的
    • 如果父類屬性是可讀寫的,那么子類重寫后的屬性也必須是可讀寫的

重寫實例屬性

  • 使用屬性需要加上super,不然會導致無限遞歸

重寫類型屬性

  • 被class修飾的計算類型屬性,可以被子類重寫
  • 被static修飾的類型屬性(存儲、計算),不可以被子類重寫

屬性觀察器

  • 可以在子類中為父類屬性(除了只讀計算屬性、let屬性)增加屬性觀察器

final

  • 被final修飾的方法、下標、屬性,禁止被重寫
  • 被final修飾的類,禁止被繼承

/—/

/– 課時8)屬性、匯編分析inout本質 –/

屬性
Swift中跟實例相關的屬性可以分為2大類

  • 存儲屬性(Stored Property)
    • 類似于成員變量這個概念
    • 存儲在實例的內存中
    • 結構體、類可以定義存儲屬性
    • 枚舉不可以定義存儲屬性
  • 計算屬性(Computed Property)
    • 本質就是方法(函數)
    • 不占用實例的內存
    • 枚舉、結構體、類都可以定義計算屬性

注意

  • 存儲屬性(關于存儲熟悉,Swift有個明確的規定)
    • 在創建 類 或 結構體的實例時,必須為所有的存儲屬性設置一個合適的初始值
      • 可以在初始化器里(init函數)為存儲屬性設置一個初始值
      • 可以分配一個默認的屬性值作為屬性定義的一部分
  • 計算屬性
    • set傳入的新值默認叫做newValue,也可以自定義
    • 只讀計算屬性:只有get,沒有set
    • 定義計算屬性只能用var,不能用let
    • 計算屬性的值是可能發生變化的(即使是只讀計算屬性)

枚舉rawValue原理
枚舉原始值rawValue的本質是:只讀計算屬性

延遲存儲屬性(Lazy Stored Property)
使用lazy可以定義一個延遲存儲屬性,在第一次用到屬性的時候才會進行初始化

  • lazy屬性必須是var,不能是let
    • let必須在實例的初始化方法完成之前就擁有值
  • 如果多條線程同時第一次訪問lazy屬性
    • 無法保證屬性只被初始化1次

延遲存儲屬性注意點

  • 當結構體包含一個延遲存儲屬性時,只有var才能訪問延遲存儲屬性
    • 因為延遲屬性初始化時需要改變結構體的內存

屬性觀察器(Property Observer)
可以為非lazy的var存儲屬性設置屬性觀察器
willSet會傳遞新值,默認叫newValue
didSet會傳遞舊值,默認叫oldValue
在初始化器中設置屬性值不會觸發willSet和didSet

全局變量、局部變量
屬性觀察器、計算屬性的功能,同樣可以應用在全局變量、局部變量身上

inout的再次研究
輸入輸出的傳遞就是引用傳遞

inout的本質總結

  • 如果實參有物理內存地址,且沒有設置屬性觀察器
    • 直接將實參的內存地址傳入函數(實參進行引用傳遞)
  • 如果實參是計算屬性 或者 設置了屬性觀察器
    • 采取了Copy In Copy Out的做法
      • 調用該函數時,先復制實參的值,產生副本【get】
      • 將副本的內存地址傳入函數(副本進行引用傳遞),在函數內部可以修改副本的值
      • 函數返回后,再將副本的值覆蓋實參的值【set】
  • 總結:inout的本質就是引用傳遞(地址傳遞)

類型屬性(Type Property)

  • 嚴格來說,屬性可以分為
    • 實例屬性(Instance Property):只能通過實例去訪問
      • 存儲實例屬性(Stored Instance Property):存儲在實例的內存中,每個實例都有1份
      • 計算實例屬性(Computed Instance Property)
    • 類型屬性(Type Property):只能通過類型去訪問
      • 存儲類型屬性(Stored Type Property):整個程序運行過程中,就只有1份內存(類似于全局變量)
      • 計算類型屬性(Computed Type Property)
  • 可通過static定義類型屬性
    • 如果是類,也可以用關鍵字class

類型屬性細節

  • 不同于存儲實例屬性,你必須給存儲類型屬性設定初始值
    • 因為類型沒有像實例那樣的init初始化器來初始化存儲屬性
  • 存儲類型屬性默認就是lazy,會在第一次使用的時候才初始化
    • 就算被多個線程同時訪問,保證只會初始化一次
    • 存儲類型屬性可以是let
  • 枚舉類型也可以定義類型屬性(存儲類型屬性、計算類型屬性)

單例模式
public class FileManager {
public static let shared = {
// …
// …
return FileManager()
}
Private init() { }
}

/—/

/– 課時7)匯編分析閉包本質02 –/

注意:
如果返回值是函數類型,那么參數的修飾要保持統一

自動閉包
注意:在函數調用中,如果需傳遞兩個參數,其中參數一條件不滿足才使用參數二,那么可以將參數二定義為函數的方式,這樣如果未使用參數二就不會被調用。
|- @autoclosure 會自動將20封裝成閉包 { 20 }
|- @autoclosure 只支持 () -> T 格式的參數
|- @autoclosure 并非只支持最后一個參數
|- 空合運算符 ?? 使用了 @autoclosure 技術
|- 有@autoclosure、無@autoclosure,構成了函數重載
|- 為了避免與期望沖突,使用@autoclosure的地方最好明確注釋清楚:這個值會被推遲執行

/—/

/– 課時6)匯編分析閉包本質01 –/

引用類型的賦值操作

值類型、引用類型的let
值類型定義let后不能修改成員值
引用類型定義let可以修改成員值

引用類型
引用賦值給var、let或者給函數傳參,是將內存地址拷貝一份
類似于制作一個文件的替身(快捷方式、鏈接),指向的是同一個文件。屬于淺拷貝(shallow copy)

嵌套類型

枚舉、結構體、類都可以定義方法
一般把定義在枚舉、結構體、類內部的函數,叫做方法
方法不占用對象的內存
方法的本質就是函數
方法、函數都存放在代碼段

閉包表達式(Closure Expression)(類似于OC的block)
在Swift中,可以通過func定義一個函數,也可以通過閉包表達式定義一個函數。
{
(參數列表) -> 返回值類型 in
函數體代碼
}

閉包表達式的簡寫
例子,閉包表達式的簡化
let descendingArray2 = cityArray.sorted(by: {s1,s2 in return s1 > s2})
let descendingArray3 = cityArray.sorted(by: {s1,s2 in s1 > s2})
let descendingArray4 = cityArray.sorted(by: {$0 > $1})
let descendingArray5 = cityArray.sorted(by: > )

尾隨閉包
如果將一個很長的閉包表達式作為函數的最后一個實參,使用尾隨閉包可以增強函數的可讀性。
|- 尾隨閉包是一個被書寫在函數調用括號外面(后面)的閉包表達式
如果閉包表達式是函數的唯一實參,而且使用了尾隨閉包的語法,那就不需要在函數名后邊寫圓括號

示例 - 數組的排序
忽略參數

閉包(Closure)
一個函數和它所捕獲的變量\常量環境組合起來,稱為閉包
|- 一般指定義在函數內部的函數
|- 一般她捕獲的是外層函數的局部變量\常量
可以把閉包想象成是一個類的實例對象
|- 內存在堆空間
|- 捕獲的局部變量\常量就是對象的成員(存儲屬性)
|- 組成閉包的函數就是類內部定義的方法

/—/

/– 課時5)匯編分析結構體、類的內存布局 –/

結構體
在Swift標準庫中,絕大多數的公開類型都是結構體,而枚舉和類只占很小一部分
比如Bool、Int、Double、String、Array、Dictionary等常見類型都是結構體
struct Date{
var year: Int
var month: Int
var day: Int
}
var date = Date(year:2019, month:6, day:23)
所有的結構體都有一個編譯器自動生成的初始化器(initializer,初始化方法、構造器、構造方法)
在上述代碼最后一行,可以傳入所有成員值,用以初始化所有成員變量(存儲屬性,Stored Property)

結構體的初始化器
編譯器會根據情況,可能會為結構體生成多個初始化器,宗旨是:保證所有成員都有初始化值

自定義初始化器
一旦在定義結構體時自定義了初始化器,編譯器就不會再幫它自動生成其他初始化器

窺探初始化器的本質
自己寫初始化值,系統會自動生成init函數


類的定義和結構體類似,但編譯器并沒有為類自動生成可以傳入成員值的初始化器

類的初始化器
如果類的所有成員都在定義的時候指定了初始值,編譯器會為類生成無參的初始化器
成員的初始化是在當前初始化器中完成的

結構體與類的本質區別
結構體是值類型(枚舉也是值類型),類是引用類型(指針類型)

值類型
值類型賦值給var、let或者給函數傳參,是直接將所有內容拷貝一份
類似于對文件進行copy、paste操作,產生了全新的文件副本。屬于深拷貝(deep copy)

Swift底層用C++寫的,所以底層跟C++很像

規律
內存地址格式為:0x4bdc(%rip),一般是全局變量,全局區(數據段)。
內存地址格式為:-0x78(%rbp),一般是局部變量,棧空間。
內存地址格式為:0x10(%rax),一般是堆空間。

值類型的復制操作(字符串、數組都是struct)
在Swift標準庫中,為了提升性能,String、Array、Dictionary、Set采取了Copy On Write的技術
(比如僅當有“寫”操作時,才會真正執行拷貝操作)
(對于標準庫值類型的賦值操作,Swift能確保最佳性能,所以沒必要為了保證最佳性能來避免賦值)
建議:不需要修改的,盡量定義成let

引用類型
引用賦值給var、let或者給函數傳參,是將內存地址拷貝一份
(類似于制作一個文件的替身(快捷方式、鏈接),指向的是同一個文件。屬于淺拷貝(shallow copy))

/—/

/– 課時3)枚舉、可選項 –/

枚舉的基本用法

關聯值(Associated Value)
有時會將枚舉的成員值跟其他類型的關聯存儲在一起,會非常有用。
enum Score {
case points(Int)
case grade(Character)
}

原始值(Raw Values)
枚舉成員可以使用相同類型的默認值預先關聯,這個默認值叫做:原始值
enum PokerSuit: Character {
case spade = “??”
case heart = “??”
case diamond = “F”
case club = “??”
}

隱式原始值(Implicitly Assigned Raw Values)
如果枚舉的原始值類型是Int、String,Swift會自動分配原始值

遞歸枚舉(Recursive Enumeration)
indirect enum ArithExpr {
case number(Int)
case sum(ArithExpr, ArithExpr)
case difference(ArithExpr, ArithExpr)
}

MemoryLayout
可以使用MemoryLayout獲取數據類型占用的內存大小

可選項(Optional)
一般也叫可選類型,它允許將值設置為nil
在類型名稱后面加個問號(?)來定義一個可選類型

強制解包(Forced Unwrapping)
可選項是對其他類型的一層包裝,可以將它理解為一個盒子
如果為nil,那么它是個空盒子
如果不為nil,那么盒子里裝的是:被包裝類型的數據
如果要從可選項中取出被包裝的數據(將盒子里裝的東西取出來),需要使用感嘆號 !進行強制解包。
如果對值為nil的可選項(空盒子)進行強制解包,將會產生運行時錯誤。

判斷可選項是否包含值
let number = Int(“k123”)
number != nil

可選項綁定(Optional Binding)
可以使用可選項綁定來判斷可選項是否包含值
如果包含就自動解包,把值賦值給一個臨時的常量(let)或者變量(var),并返回true,否則返回false
if let number = Int(“123”) {
}else {}

等階寫法
可選項綁定需要使用逗號分割判斷

While循環中使用可選項綁定

空合運算符?? (Nil-Coalescing Operator)
let username = loginName ?? “Guest”
loginName 表示為可選性,如果loginName 為空,則使用默認名稱 Guest
a ?? b
a 是可選項
b 是可選項 或者 不是可選項
b 跟a 的存儲類型必須相同
如果a 不為nil,就返回a
如果a 為nil,就返回b
如果b 不是可選項,返回a 時會自動解包

多個 ?? 一起使用

?? 跟 if let 配合使用
let a: Int? = nil
let b: Int? = 2
if let c = a ?? b {
print?
}// 類似于 if a!=nil || b!=nil

if let c = a, let d = b {
print?
print(d)
}// 類似于 if a!=nil && b!=nil

guard語句
guard 條件 else {
退出當前作用域
}
當guard語句的條件為false時,就會執行大括號里面的代碼
當guard語句的條件為true時,就會跳過guard語句
Guard語句特別適合用來”提前退出“
當使用guard語句進行可選項綁定時,綁定的常量(let)、變量(var)也能在外層作用域中使用

隱式解包(Implicitly Unwrapped Optional)
在某些情況下,可選項一旦被設定值之后,就會一直擁有值
在這種情況下,可以去掉檢查,也不必每次訪問的時候都進行解包,因為它能確定每次訪問的時候都有值。
可以在類型后面加個感嘆號 !定義一個隱式解包的可選項。

字符串插值
可選項在字符串插插值或者直接打印,編譯器會發出警告

多重可選項
var num1: Int? = 10
var num2: Int?? = num1
var num3: Int?? = 10
可以使用lldb指令 frame variable -R 或者 fr v -R 查看區別

關于感嘆號( ! ),若在對象后面加感嘆號則表示其所對應的變量或常量一定有值。

/—/

/– 課時2)流程控制、函數、匯編分析內聯優化 –/

流程控制

if-else
if后面的條件可以省略小括號,但條件后面的大括號不可以省略。
if后面的條件只能是Bool類型

while 和 repeat-while(相當于C語言中的do-while)
從Swift3開始,去除了自增(++)、自減(–)運算符

for
閉區間運算符:a…b,a <= 取值 <= b
例子:
for i in 0…3 {
print(i)
} // 0 1 2 3
半開區間運算符: a…<b,a <= 取值 < b
例子:
for i in 1…<5 {
print(i)
} // 1 2 3 4

for - 區間運算符用在數組上
let names = [“Anna”, “Alex”, “Brian”, “Jack”]
for name in names[0…3] {
print(name)
} // Anna Alex Brian Jack
單側區間:讓區間朝一個方向盡可能的遠
names[2…] 或者 names[…2] 或者 names[…<2]

switch
在其case、default后面不能寫大括號{}
默認可以不寫break,并不會貫穿到后面的條件
但是,使用fallthrough可以實現貫穿效果
switch必須要保證能處理所有情況
case、default后面至少要有一條語句
如果不想做任何事,加個break即可
如果能保證已處理所有情況,也可以不必使用default
復合條件,switch也支持Character、String類型
區間匹配、元組匹配

值綁定、where、標簽語句(需要在嵌套的for循環里面控制外面的循環加個標簽即可)

函數的定義:
func sum(v1: Int, v2: Int) -> Int {
return v1 + v2
}
調用:sum(v1: 10, v2: 20)
形參默認是let,也只能是let

無返回值的三種寫法:
第一種
func sayHello() -> Void {
print(“Hello”)
}
第二種
func sayHello() -> () { // ()可以理解為是元組
print(“Hello”)
}
第三種
func sayHello() {
print(“Hello”)
}

隱式返回:
如果整個函數體是一個單一表達式,那么函數會隱式返回這個表達式
func sum(v1: Int, v2: Int) -> Int {
v1 + v2
}

返回元組:實現多返回值
func calculate(v1: Int, v2: Int) -> (sum: Int, difference: Int, average: Int) {
let sum = v1 + v2
return (sum, v1 - v2, sum >> 1)
}
let result = calculate(v1: 20, V2: 10)
result.sum // 30
result.difference // 10
result.average // 15

函數的文檔注釋(好麻煩的,做個了解就好)

參數標簽
可以修改參數標簽
func goToWork(at time: String) {
print(“this time is (time)”)
}
goToWork(at: “08:00”)
// this time is 08:00

可以使用下劃線_ 省略參數標簽
func sum(_ v1: Int, _ v2: Int) -> Int {
v1 + v2
}
sum(10, 20)

默認參數值(Default Parameter Value)
func check(name: String = “nobody”, age: Int, job: String = “none”) {
print(“name=(name), age=(age), job=(job)”)
}
check(name: “Jack”, age: 20, job: “Doctor”)
check(name: “Rose”, age: 18)
check(age: 10, job: “Batman”)
check(age: 15)
C++的默認參數值有個限制:必須從右往左設置。由于Swift擁有參數標簽,因此并沒有此類限制。
但是在省略參數標簽時,需要特別注意,避免出錯。

可變參數(Variadic Parameter)
func sum(_ numbers: Int…) -> Int {
var total = 0
for number in numbers {
total += number
}
return total
}
sum(10, 20, 30, 40) // 100
一個函數最多只能有1個可變參數
緊跟在可變參數后面的參數不能省略參數標簽

Swift自帶的print函數

輸入輸出參數(In-Out Parameter)
可以用inout定義一個輸入輸出參數:可以在函數內部修改外部實參的值

func swapValues(_ v1: inout Int, _ v2: inout Int) {let tmp = v1v1 = v2v2 = tmp } var num1 = 10 var num2 = 20 swapValues(&num1, &num2)

可變參數不能標記為inout
inout參數不能有默認值
inout參數的本質是地址傳遞(引用傳遞)
inout參數只能傳入可以被多次賦值的

函數重載(Function Overload)
規則:
函數相同
參數個數不同 || 參數類型不同 || 參數標簽不同
注意點:
返回值類型與函數重載無關
默認參數值和函數重載一起使用產生二義性時,編譯器并不會報錯(在C++中會報錯)
可變參數、省略參數標簽、函數重載一起使用產生二義性時,編譯器有可能會報錯

內聯函數(Inline Function)
如果開啟了編譯器優化(Release模式默認會開啟優化),編譯器會自動將某些函數編程內聯函數
其作用是將函數調用展開成函數體
哪些函數不會被內聯?
函數體比較長
包含遞歸調用
包含動態派發

函數類型(Function Type)
每一個函數都是有類型的,函數類型由形式參數類型、返回值類型組成

函數類型作為函數參數
函數類型作為函數返回值
返回值是函數類型的函數,叫做高階函數(Higher-Order Function)

typealias(用來給類型起別名)
typealias Byte = Int8
typealias Short = Int16
typealias Long = Int64

嵌套函數(Nested Function)
將函數定義在函數內部
func forward(_ forward:Bool) -> (Int) -> Int {
func next(_ input: Int) -> Int {
input + 1
}
func previous(_ input: Int) -> Int {
input - 1
}
return forward ? next : previous
}
forward(true)(3)
forward(false)(3)

/—/

/– 課時1)基礎語法、匯編初探 –/

swiftc是Swift的編譯指令;
swiftc存放在Xcode內部;

一些操作
+生成語法樹: swiftc -dump-ast main.swift
+生成最簡潔的SIL代碼: swiftc -emit-sil main.swift
+生成LLVM IR代碼: swiftc -emit-ir main.swift -0 main.ll
*生成匯編代碼: swiftc -emit-assembly main.swift -o main.s

能對匯編代碼進行分析,可以真正掌握編程語言的本質。

支持單行、多行、嵌套等注釋方式
還支持markup(與markdown相似)(注釋后面緊跟一個冒號開始markup)
開始markup渲染效果:Editor -> Show Rendered Markup
注意:Markup只在Playground中有效

常量
只能賦值1次
它的值不要求在編譯時期確定,但使用之前必須賦值1次
常量可以在一開始不賦值,但是需要在一開始時定義其類型

標識符
標識符(比如常量名、變量名、函數名)幾乎可以使用任何字符
標識符不能以數字開頭,不能包含空白字符、制表支付、箭頭等特殊字符

常見數據類型
值類型(value type)
|-- {枚舉(enum),Optional}
|-- {結構體(struct)Bool、Int、Float、Double、Character;
String、Array、Dictionary、Set}
引用類型(reference type)
|-- {類(class}

整數
let intDecimal = 17 // 十進制
let intBinary = 0b10001 // 二進制
let intOctal = 0o21 // 八進制
Let intHexadecimal = 0x11 // 十六進制

/—/

/– 目錄 –/

目錄:從入門到精通Swift編程
├─01-基礎語法、匯編初探
│ └─1-1-【回放】基礎語法、匯編初探.mp4

├─02-流程控制、函數、匯編分析內聯優化
│ └─2-1-【回放】流程控制、函數、匯編分析內聯優化.mp4

├─03-枚舉、可選項
│ └─3-1-【回放】枚舉、可選項.mp4

├─04-匯編分析枚舉的內存布局
│ └─4-1-【回放】匯編分析枚舉的內存布局.mp4

├─05-匯編分析結構體、類的內存布局
│ └─5-1-【回放】匯編分析結構體、類的內存布局.mp4

├─06-匯編分析閉包本質01
│ └─6-1-【回放】匯編分析閉包本質01.mp4

├─07-匯編分析閉包本質02
│ └─7-1-【回放】匯編分析閉包本質02 .mp4

├─08-屬性、匯編分析inout本質
│ └─8-1-【回放】屬性、匯編分析inout本質 .mp4

├─09-匯編分析類型屬性、方法、下標、繼承
│ └─9-1-【回放】匯編分析類型屬性、方法、下標、繼承 .mp4

├─10-匯編分析多態原理、init
│ └─10-1-【回放】匯編分析多態原理、初始化、可選鏈 .mp4

├─11-init、deinit、可選鏈、協議、元類型
│ └─11-01-【回放】init、deinit、可選鏈、協議、元類型 .mp4

├─12-Error處理、泛型
│ └─12-01-【回放】Error處理、泛型 .mp4

├─13-匯編分析String、Array底層
│ └─13-01-【回放】匯編分析String、Array底層 .mp4

├─14-可選項的本質、運算符重載、擴展
│ └─14-01-【回放】可選項的本質、運算符重載、擴展 .mp4

├─15-訪問控制、內存管理
│ └─15-01-【回放】訪問控制、內存管理.mp4

├─16-內存訪問沖突、指針
│ └─16-01-【回放】內存訪問沖突、指針 .mp4

├─17-字面量協議、模式匹配、條件編譯
│ └─17-01-【回放】字面量協議、模式匹配、條件編譯 .mp4

├─18-從OC到Swift
│ └─18-01-【回放】從OC到Swift.mp4

├─19-從OC到Swift、函數式編程
│ └─19-01-【回放】從OC到Swift、函數式編程 .mp4│

├─20- 函數式編程、面向協議編程
│ └─20-01-【回放】 函數式編程、面向協議編程 .mp4

├─21-面向協議編程、響應式編程
│ └─21-01-【回放】面向協議編程、響應式編程.mp4

├─22-標準庫源碼分析、項目實戰
│ └─22-01-【回放】標準庫源碼分析、項目實戰.mp4

└─22. 標準庫源碼分析、項目實戰
└─22. 標準庫源碼分析、項目實戰_batch.mp4

/—/

總結

以上是生活随笔為你收集整理的SwiftNote的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩av无码一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 高清无码午夜福利视频 | 欧美人与牲动交xxxx | 亚洲 激情 小说 另类 欧美 | 一区二区三区乱码在线 | 欧洲 | 亚洲日本va午夜在线电影 | 国产精品无码成人午夜电影 | 草草网站影院白丝内射 | 久久国产精品萌白酱免费 | 欧美放荡的少妇 | 日日摸夜夜摸狠狠摸婷婷 | 日本在线高清不卡免费播放 | 久热国产vs视频在线观看 | 亚洲爆乳精品无码一区二区三区 | 亚洲 激情 小说 另类 欧美 | 国产乱人无码伦av在线a | 野外少妇愉情中文字幕 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产黄在线观看免费观看不卡 | 国产无遮挡吃胸膜奶免费看 | 久久亚洲国产成人精品性色 | 无码国产乱人伦偷精品视频 | 精品乱子伦一区二区三区 | 激情内射日本一区二区三区 | 老司机亚洲精品影院无码 | 日韩av无码中文无码电影 | 国内综合精品午夜久久资源 | 欧美日本免费一区二区三区 | www国产亚洲精品久久久日本 | 蜜桃视频插满18在线观看 | 女高中生第一次破苞av | 婷婷色婷婷开心五月四房播播 | 亚洲一区二区三区四区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 免费看男女做好爽好硬视频 | 国产真实乱对白精彩久久 | 亚洲精品国产精品乱码不卡 | 欧美xxxxx精品 | 丰满人妻被黑人猛烈进入 | 精品久久久久久人妻无码中文字幕 | 天天躁日日躁狠狠躁免费麻豆 | 精品国产av色一区二区深夜久久 | 国产精品久久久一区二区三区 | 中文精品无码中文字幕无码专区 | 乌克兰少妇xxxx做受 | 国产午夜无码视频在线观看 | 久久www免费人成人片 | 国产又爽又黄又刺激的视频 | 国产舌乚八伦偷品w中 | 理论片87福利理论电影 | 国产在线一区二区三区四区五区 | 久久99精品国产麻豆 | 国内揄拍国内精品人妻 | 偷窥村妇洗澡毛毛多 | 中文字幕+乱码+中文字幕一区 | 欧美 丝袜 自拍 制服 另类 | 在线播放免费人成毛片乱码 | 国产精品久久福利网站 | 国产亚洲美女精品久久久2020 | 中文字幕人成乱码熟女app | 国精产品一区二区三区 | 强辱丰满人妻hd中文字幕 | 亚洲大尺度无码无码专区 | 国产舌乚八伦偷品w中 | 久久久久免费精品国产 | 欧美喷潮久久久xxxxx | 熟女少妇人妻中文字幕 | 久久精品女人的天堂av | 狠狠综合久久久久综合网 | 麻豆国产人妻欲求不满 | 亚洲国产精华液网站w | 日日橹狠狠爱欧美视频 | 高潮毛片无遮挡高清免费 | 亚洲精品国偷拍自产在线麻豆 | 日韩欧美中文字幕公布 | 亚洲精品成人福利网站 | 人人爽人人爽人人片av亚洲 | 亚洲 日韩 欧美 成人 在线观看 | 色欲人妻aaaaaaa无码 | 少妇性俱乐部纵欲狂欢电影 | 国产亚洲精品久久久久久大师 | 精品无码国产一区二区三区av | 国产精品亚洲综合色区韩国 | 丁香啪啪综合成人亚洲 | 欧美肥老太牲交大战 | 无码人妻丰满熟妇区毛片18 | 欧美成人家庭影院 | 成人免费视频一区二区 | 国产精品无码永久免费888 | 日韩少妇内射免费播放 | 草草网站影院白丝内射 | 欧美日韩亚洲国产精品 | 乱人伦中文视频在线观看 | 亚洲国精产品一二二线 | 国产精品沙发午睡系列 | 无码人妻精品一区二区三区不卡 | 黑人玩弄人妻中文在线 | √天堂资源地址中文在线 | 欧美xxxx黑人又粗又长 | 亚洲色欲色欲天天天www | 欧美日韩一区二区综合 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲一区二区三区无码久久 | 精品夜夜澡人妻无码av蜜桃 | 在线欧美精品一区二区三区 | www国产亚洲精品久久网站 | 国产激情精品一区二区三区 | 水蜜桃色314在线观看 | 亚洲s色大片在线观看 | 日本一区二区三区免费高清 | 玩弄中年熟妇正在播放 | 久久综合网欧美色妞网 | 欧美黑人乱大交 | 国产9 9在线 | 中文 | 狠狠噜狠狠狠狠丁香五月 | 亚洲精品综合一区二区三区在线 | 日日碰狠狠躁久久躁蜜桃 | 午夜福利试看120秒体验区 | 一本久久伊人热热精品中文字幕 | 亚洲午夜无码久久 | 国产xxx69麻豆国语对白 | 色欲av亚洲一区无码少妇 | 日本熟妇大屁股人妻 | 18黄暴禁片在线观看 | 亚洲男人av天堂午夜在 | 最近的中文字幕在线看视频 | 国内精品人妻无码久久久影院蜜桃 | 粉嫩少妇内射浓精videos | 亚洲国产av精品一区二区蜜芽 | 水蜜桃亚洲一二三四在线 | 亚洲成a人片在线观看无码 | 国产国语老龄妇女a片 | 九九热爱视频精品 | 中文精品无码中文字幕无码专区 | 精品国产国产综合精品 | 精品偷拍一区二区三区在线看 | 亚洲国产成人av在线观看 | 成人无码视频免费播放 | 国产性生大片免费观看性 | 人妻少妇精品久久 | 欧洲熟妇精品视频 | 老司机亚洲精品影院无码 | 欧美 日韩 人妻 高清 中文 | 最新国产麻豆aⅴ精品无码 | 亚洲熟妇自偷自拍另类 | 成 人 免费观看网站 | 欧美阿v高清资源不卡在线播放 | 日本精品高清一区二区 | 窝窝午夜理论片影院 | 大肉大捧一进一出好爽视频 | 99精品视频在线观看免费 | 国产精品多人p群无码 | 人妻无码久久精品人妻 | 久久亚洲日韩精品一区二区三区 | 97精品国产97久久久久久免费 | 自拍偷自拍亚洲精品被多人伦好爽 | 中文字幕乱码亚洲无线三区 | 国产在线精品一区二区高清不卡 | 我要看www免费看插插视频 | 娇妻被黑人粗大高潮白浆 | 中文字幕日产无线码一区 | 婷婷五月综合激情中文字幕 | 亚洲精品一区二区三区在线 | 亚洲精品久久久久中文第一幕 | 国产精品久久久久久亚洲影视内衣 | 久久国产精品_国产精品 | 大肉大捧一进一出好爽视频 | 国产艳妇av在线观看果冻传媒 | 少妇无码一区二区二三区 | 亚洲中文字幕av在天堂 | 久久国产劲爆∧v内射 | 性欧美大战久久久久久久 | 国产区女主播在线观看 | 欧美人与禽猛交狂配 | 99久久精品国产一区二区蜜芽 | 一本色道婷婷久久欧美 | 欧美午夜特黄aaaaaa片 | 亚洲中文字幕无码一久久区 | 丰满少妇高潮惨叫视频 | 成人免费视频在线观看 | 国产 浪潮av性色四虎 | 天天拍夜夜添久久精品大 | 300部国产真实乱 | 最近免费中文字幕中文高清百度 | 中文亚洲成a人片在线观看 | 大地资源网第二页免费观看 | 激情爆乳一区二区三区 | 天下第一社区视频www日本 | 亚洲va中文字幕无码久久不卡 | 暴力强奷在线播放无码 | 国产口爆吞精在线视频 | 久久久精品人妻久久影视 | 免费无码肉片在线观看 | 欧美激情内射喷水高潮 | 国产亚洲精品久久久久久国模美 | 亚洲精品综合五月久久小说 | 牲欲强的熟妇农村老妇女视频 | 国产人妖乱国产精品人妖 | 理论片87福利理论电影 | 爱做久久久久久 | 男女超爽视频免费播放 | 性生交大片免费看女人按摩摩 | 国产肉丝袜在线观看 | 青春草在线视频免费观看 | 男女猛烈xx00免费视频试看 | 欧美日韩久久久精品a片 | 亚洲人成网站在线播放942 | 人人妻人人澡人人爽人人精品浪潮 | 久久精品无码一区二区三区 | 国产97色在线 | 免 | 久久97精品久久久久久久不卡 | 成人免费视频一区二区 | 国产精品办公室沙发 | 又色又爽又黄的美女裸体网站 | 18无码粉嫩小泬无套在线观看 | 白嫩日本少妇做爰 | 欧美激情综合亚洲一二区 | 爽爽影院免费观看 | 久久综合香蕉国产蜜臀av | 国产疯狂伦交大片 | 国产精品美女久久久网av | 国内少妇偷人精品视频 | 伊在人天堂亚洲香蕉精品区 | 国产 精品 自在自线 | 国产av一区二区精品久久凹凸 | 精品国产成人一区二区三区 | 沈阳熟女露脸对白视频 | 久久久久久久人妻无码中文字幕爆 | 亚洲欧美精品aaaaaa片 | 少妇人妻大乳在线视频 | 国产成人一区二区三区在线观看 | 欧美性猛交内射兽交老熟妇 | 正在播放东北夫妻内射 | 免费无码av一区二区 | 精品亚洲韩国一区二区三区 | 人人妻人人澡人人爽欧美一区九九 | 久久精品人人做人人综合 | 亚洲欧洲中文日韩av乱码 | 国产人妻久久精品二区三区老狼 | 丰满人妻一区二区三区免费视频 | 国精品人妻无码一区二区三区蜜柚 | 蜜桃臀无码内射一区二区三区 | 又大又黄又粗又爽的免费视频 | 免费中文字幕日韩欧美 | 国产成人无码午夜视频在线观看 | 亚洲无人区一区二区三区 | 精品一区二区三区无码免费视频 | 中文字幕 亚洲精品 第1页 | 亚洲欧美日韩成人高清在线一区 | 欧美xxxxx精品 | 日本精品人妻无码免费大全 | 亚洲精品一区二区三区四区五区 | 国产精品久久久av久久久 | 熟女少妇在线视频播放 | 国产网红无码精品视频 | 午夜福利一区二区三区在线观看 | 波多野结衣av一区二区全免费观看 | 久久久婷婷五月亚洲97号色 | 无码成人精品区在线观看 | 国产美女精品一区二区三区 | 欧美日韩一区二区免费视频 | 大肉大捧一进一出好爽视频 | 国产精品久久久久无码av色戒 | 黑人粗大猛烈进出高潮视频 | 亚洲精品综合一区二区三区在线 | 亚洲理论电影在线观看 | 国产亚洲人成a在线v网站 | 99久久久国产精品无码免费 | 国产无av码在线观看 | 内射后入在线观看一区 | 在线观看国产午夜福利片 | 亚洲精品欧美二区三区中文字幕 | 无码福利日韩神码福利片 | 国产av无码专区亚洲a∨毛片 | 久久久久成人精品免费播放动漫 | 美女黄网站人色视频免费国产 | 乱人伦人妻中文字幕无码 | 国产欧美亚洲精品a | 日本护士xxxxhd少妇 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 又黄又爽又色的视频 | 久久久国产精品无码免费专区 | 一个人免费观看的www视频 | 无码人妻久久一区二区三区不卡 | 亚洲国产精品成人久久蜜臀 | 97夜夜澡人人双人人人喊 | 四虎影视成人永久免费观看视频 | 国产精品久久久久影院嫩草 | 亚欧洲精品在线视频免费观看 | 一个人看的视频www在线 | 成 人影片 免费观看 | 性史性农村dvd毛片 | 国产熟妇另类久久久久 | www国产亚洲精品久久网站 | 99麻豆久久久国产精品免费 | 久久国产精品_国产精品 | 久久熟妇人妻午夜寂寞影院 | 正在播放老肥熟妇露脸 | 亚洲小说春色综合另类 | 色噜噜亚洲男人的天堂 | 久久伊人色av天堂九九小黄鸭 | 装睡被陌生人摸出水好爽 | 精品夜夜澡人妻无码av蜜桃 | 欧美一区二区三区视频在线观看 | 无套内射视频囯产 | 久久久久成人精品免费播放动漫 | 久久www免费人成人片 | 国产在热线精品视频 | 亚洲 欧美 激情 小说 另类 | 日韩欧美群交p片內射中文 | 亚洲精品久久久久avwww潮水 | 特级做a爰片毛片免费69 | 三上悠亚人妻中文字幕在线 | 国内老熟妇对白xxxxhd | 九九久久精品国产免费看小说 | 狠狠色欧美亚洲狠狠色www | 国产精品无码久久av | 激情内射日本一区二区三区 | 亚洲区欧美区综合区自拍区 | 一区二区三区高清视频一 | 婷婷五月综合缴情在线视频 | 久久婷婷五月综合色国产香蕉 | 少妇激情av一区二区 | 国产精品香蕉在线观看 | 国产精品久久久久久亚洲影视内衣 | 亚洲熟悉妇女xxx妇女av | 国产精品香蕉在线观看 | 偷窥日本少妇撒尿chinese | 亚洲欧洲日本无在线码 | 日韩在线不卡免费视频一区 | 亚洲精品无码国产 | 无码毛片视频一区二区本码 | 日韩视频 中文字幕 视频一区 | 在线亚洲高清揄拍自拍一品区 | 最近的中文字幕在线看视频 | 强辱丰满人妻hd中文字幕 | 国产精品久久国产三级国 | 熟妇人妻激情偷爽文 | 欧美黑人乱大交 | 九九久久精品国产免费看小说 | 久久久久久a亚洲欧洲av冫 | 国产精品无码一区二区桃花视频 | 亚洲欧美综合区丁香五月小说 | 日本va欧美va欧美va精品 | 男女超爽视频免费播放 | 久久99精品久久久久久 | 久久久久久久久蜜桃 | 亚洲综合无码久久精品综合 | 天堂一区人妻无码 | 亚洲熟女一区二区三区 | 亚洲中文字幕在线无码一区二区 | 精品国产福利一区二区 | 色综合久久久无码网中文 | 亚洲の无码国产の无码影院 | 岛国片人妻三上悠亚 | 奇米影视7777久久精品人人爽 | 久久97精品久久久久久久不卡 | 免费男性肉肉影院 | 乱码av麻豆丝袜熟女系列 | 国内精品一区二区三区不卡 | 无码av岛国片在线播放 | 国产亚洲精品久久久久久国模美 | 国产真实伦对白全集 | 亚洲春色在线视频 | 久久精品国产一区二区三区肥胖 | 国产色xx群视频射精 | 国产免费久久久久久无码 | 国产香蕉尹人综合在线观看 | 内射爽无广熟女亚洲 | 久久无码人妻影院 | 黑人粗大猛烈进出高潮视频 | 国产成人亚洲综合无码 | 黑森林福利视频导航 | 中文字幕无码日韩专区 | 亚洲中文字幕乱码av波多ji | 国产精品va在线播放 | 亚洲精品美女久久久久久久 | 欧美日韩色另类综合 | 人人澡人摸人人添 | 2020久久超碰国产精品最新 | 国产亚洲视频中文字幕97精品 | 东京一本一道一二三区 | 日韩精品无码一区二区中文字幕 | 欧洲vodafone精品性 | 女人和拘做爰正片视频 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产欧美精品一区二区三区 | av人摸人人人澡人人超碰下载 | 西西人体www44rt大胆高清 | 人妻体内射精一区二区三四 | 中文字幕无码免费久久99 | 一本精品99久久精品77 | 2019午夜福利不卡片在线 | 免费无码的av片在线观看 | 偷窥日本少妇撒尿chinese | 国产熟妇另类久久久久 | av人摸人人人澡人人超碰下载 | 国产va免费精品观看 | 欧美亚洲日韩国产人成在线播放 | 67194成是人免费无码 | 国产亚洲人成a在线v网站 | 国内精品九九久久久精品 | 成人免费视频视频在线观看 免费 | 97精品人妻一区二区三区香蕉 | 人人澡人人透人人爽 | 日本高清一区免费中文视频 | 亚洲综合无码久久精品综合 | 欧美黑人性暴力猛交喷水 | 亚洲精品国产第一综合99久久 | 久久综合激激的五月天 | 一本精品99久久精品77 | 国产精品成人av在线观看 | 欧洲vodafone精品性 | 国产欧美熟妇另类久久久 | 清纯唯美经典一区二区 | 帮老师解开蕾丝奶罩吸乳网站 | 四十如虎的丰满熟妇啪啪 | 波多野结衣高清一区二区三区 | 青青青手机频在线观看 | 成人欧美一区二区三区 | 久久久亚洲欧洲日产国码αv | 国产人妻大战黑人第1集 | 免费无码肉片在线观看 | 美女扒开屁股让男人桶 | 亚洲欧洲无卡二区视頻 | 国产成人无码av在线影院 | 一个人看的www免费视频在线观看 | 台湾无码一区二区 | 国产精品久久久久久亚洲影视内衣 | 亚洲s码欧洲m码国产av | 久久国产精品偷任你爽任你 | 久久久久99精品成人片 | 亚洲一区二区三区无码久久 | 国产精品久久久久影院嫩草 | 亚洲狠狠色丁香婷婷综合 | 永久免费观看美女裸体的网站 | 国产尤物精品视频 | 国内综合精品午夜久久资源 | 性史性农村dvd毛片 | 三级4级全黄60分钟 | 久久精品人人做人人综合试看 | 小sao货水好多真紧h无码视频 | 色窝窝无码一区二区三区色欲 | 无码人妻精品一区二区三区不卡 | 亚洲区小说区激情区图片区 | 亚洲日韩精品欧美一区二区 | 97色伦图片97综合影院 | 人人妻人人藻人人爽欧美一区 | √8天堂资源地址中文在线 | 丝袜人妻一区二区三区 | 装睡被陌生人摸出水好爽 | 亚洲精品国偷拍自产在线麻豆 | 中文久久乱码一区二区 | 国产精品视频免费播放 | 东京无码熟妇人妻av在线网址 | 国产午夜福利亚洲第一 | 十八禁真人啪啪免费网站 | 日韩亚洲欧美精品综合 | 男女爱爱好爽视频免费看 | 亚洲s色大片在线观看 | 欧美成人免费全部网站 | 99精品久久毛片a片 | 国产人妻精品一区二区三区 | 国产九九九九九九九a片 | 亚洲精品一区国产 | 国产黄在线观看免费观看不卡 | 亚洲国产精品无码一区二区三区 | 成 人 网 站国产免费观看 | 水蜜桃色314在线观看 | 东京热无码av男人的天堂 | 久久精品视频在线看15 | 国产极品美女高潮无套在线观看 | 四虎国产精品免费久久 | 久久久久久久女国产乱让韩 | 野狼第一精品社区 | 牲欲强的熟妇农村老妇女 | 丰满少妇高潮惨叫视频 | 无套内谢老熟女 | 无码福利日韩神码福利片 | 无码人妻少妇伦在线电影 | 国产精品久久福利网站 | 欧洲精品码一区二区三区免费看 | 亚洲一区二区三区含羞草 | 欧美黑人性暴力猛交喷水 | 国产熟妇另类久久久久 | 亚洲s色大片在线观看 | 成人免费无码大片a毛片 | 免费无码肉片在线观看 | 欧美zoozzooz性欧美 | 亚洲欧洲日本无在线码 | 无码人妻丰满熟妇区五十路百度 | 内射爽无广熟女亚洲 | 日韩少妇白浆无码系列 | 亚洲色在线无码国产精品不卡 | 少妇久久久久久人妻无码 | 国产后入清纯学生妹 | 亚洲毛片av日韩av无码 | 樱花草在线社区www | 色五月五月丁香亚洲综合网 | 国产精品亚洲一区二区三区喷水 | 中文无码成人免费视频在线观看 | 少妇激情av一区二区 | 免费无码一区二区三区蜜桃大 | 精品水蜜桃久久久久久久 | 亚洲国产精品毛片av不卡在线 | 久久久婷婷五月亚洲97号色 | 国产精品成人av在线观看 | 国产精品久久福利网站 | 亚洲综合精品香蕉久久网 | yw尤物av无码国产在线观看 | 婷婷丁香五月天综合东京热 | 一本大道久久东京热无码av | 亚洲精品综合一区二区三区在线 | 国内丰满熟女出轨videos | ass日本丰满熟妇pics | 亚洲精品国偷拍自产在线观看蜜桃 | 大地资源网第二页免费观看 | 六十路熟妇乱子伦 | 久久久久se色偷偷亚洲精品av | 欧美精品免费观看二区 | 又大又紧又粉嫩18p少妇 | 国产成人精品优优av | 欧美兽交xxxx×视频 | 又大又紧又粉嫩18p少妇 | 久久久久久国产精品无码下载 | 亚洲一区二区三区 | 西西人体www44rt大胆高清 | 丁香花在线影院观看在线播放 | 国产 浪潮av性色四虎 | 真人与拘做受免费视频 | 无码免费一区二区三区 | 日本免费一区二区三区最新 | 亚洲中文字幕乱码av波多ji | 国产成人综合美国十次 | 国产精品无码久久av | 亚洲午夜久久久影院 | 一本久道久久综合狠狠爱 | 国产精品毛多多水多 | 国产综合色产在线精品 | 国产成人无码av片在线观看不卡 | 国产sm调教视频在线观看 | 精品国产乱码久久久久乱码 | 全黄性性激高免费视频 | 国产欧美精品一区二区三区 | 国产人成高清在线视频99最全资源 | 国产人妖乱国产精品人妖 | 成人无码视频免费播放 | 成人精品视频一区二区 | a在线观看免费网站大全 | 国产熟妇另类久久久久 | 熟妇人妻无码xxx视频 | 亚洲色在线无码国产精品不卡 | 亚洲国产精品无码久久久久高潮 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久精品国产一区二区三区 | 成人无码影片精品久久久 | 伊人久久大香线焦av综合影院 | 亚洲成av人影院在线观看 | 成人亚洲精品久久久久 | 中文字幕日产无线码一区 | 久久人人爽人人爽人人片av高清 | 亚洲欧美精品伊人久久 | 亚洲欧美国产精品专区久久 | 亚洲一区二区三区 | 亚洲国产精品美女久久久久 | 日本饥渴人妻欲求不满 | 性史性农村dvd毛片 | 亚洲精品久久久久久一区二区 | 99久久人妻精品免费一区 | 97精品国产97久久久久久免费 | 国产一区二区三区精品视频 | 欧美日韩色另类综合 | 免费无码的av片在线观看 | 亚洲国产精品毛片av不卡在线 | 蜜桃视频插满18在线观看 | 野外少妇愉情中文字幕 | 天堂无码人妻精品一区二区三区 | 国产亚洲精品久久久久久久久动漫 | 亚洲国产精品久久久天堂 | 色综合天天综合狠狠爱 | 色欲久久久天天天综合网精品 | 久久综合给久久狠狠97色 | 国产精品嫩草久久久久 | 亚洲精品综合五月久久小说 | 亚洲娇小与黑人巨大交 | 欧美亚洲日韩国产人成在线播放 | 欧美三级不卡在线观看 | 日本高清一区免费中文视频 | 少妇高潮喷潮久久久影院 | 久久久久久久久蜜桃 | 日韩 欧美 动漫 国产 制服 | 欧美第一黄网免费网站 | 国产精品自产拍在线观看 | 成人无码精品1区2区3区免费看 | 久久亚洲国产成人精品性色 | 全球成人中文在线 | 亚洲七七久久桃花影院 | 夜夜高潮次次欢爽av女 | 国产激情精品一区二区三区 | 日本va欧美va欧美va精品 | 久久精品中文字幕大胸 | 国产熟女一区二区三区四区五区 | 色爱情人网站 | 成人av无码一区二区三区 | 狂野欧美激情性xxxx | 美女扒开屁股让男人桶 | 无码精品人妻一区二区三区av | 久久午夜无码鲁丝片午夜精品 | 3d动漫精品啪啪一区二区中 | 国产精品人妻一区二区三区四 | 日本一卡二卡不卡视频查询 | 亚洲中文字幕在线观看 | 大肉大捧一进一出好爽视频 | 亚洲高清偷拍一区二区三区 | 国产精品久久久久久无码 | 亚洲成a人片在线观看无码3d | 久久精品国产日本波多野结衣 | 久久国产自偷自偷免费一区调 | 无码毛片视频一区二区本码 | 天天av天天av天天透 | √天堂中文官网8在线 | 亚洲 激情 小说 另类 欧美 | 精品一区二区三区波多野结衣 | 欧美熟妇另类久久久久久不卡 | 国产高清不卡无码视频 | 国产精品资源一区二区 | 日韩精品a片一区二区三区妖精 | 亚洲精品久久久久久久久久久 | 九九在线中文字幕无码 | 秋霞成人午夜鲁丝一区二区三区 | 樱花草在线播放免费中文 | 亚洲国产精品一区二区美利坚 | 国产亲子乱弄免费视频 | 亚洲成熟女人毛毛耸耸多 | 无码人妻精品一区二区三区不卡 | 亚洲 激情 小说 另类 欧美 | 亚洲欧美国产精品久久 | 少妇性l交大片欧洲热妇乱xxx | 图片小说视频一区二区 | 狠狠色噜噜狠狠狠7777奇米 | aⅴ亚洲 日韩 色 图网站 播放 | 人妻尝试又大又粗久久 | 成人一在线视频日韩国产 | 婷婷五月综合激情中文字幕 | 又紧又大又爽精品一区二区 | 国产精品免费大片 | 亚拍精品一区二区三区探花 | 成人无码视频免费播放 | 麻豆精品国产精华精华液好用吗 | 亚洲综合伊人久久大杳蕉 | 99久久精品无码一区二区毛片 | 人人爽人人澡人人人妻 | 精品久久久久久人妻无码中文字幕 | 亚洲成色在线综合网站 | 国内揄拍国内精品人妻 | 欧洲美熟女乱又伦 | 宝宝好涨水快流出来免费视频 | 国产精品亚洲综合色区韩国 | 伦伦影院午夜理论片 | 一个人免费观看的www视频 | 久久人人爽人人爽人人片av高清 | 日产国产精品亚洲系列 | 久久 国产 尿 小便 嘘嘘 | 久久精品国产日本波多野结衣 | 无码人妻丰满熟妇区毛片18 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲狠狠婷婷综合久久 | 无码国产色欲xxxxx视频 | 亚洲一区二区三区国产精华液 | 国产偷抇久久精品a片69 | 日韩精品a片一区二区三区妖精 | 免费播放一区二区三区 | 丁香花在线影院观看在线播放 | 中文字幕精品av一区二区五区 | 美女张开腿让人桶 | 在线播放亚洲第一字幕 | 亚洲精品久久久久久一区二区 | 亚洲精品综合一区二区三区在线 | 国产精品久久久久久久9999 | 丁香啪啪综合成人亚洲 | 色老头在线一区二区三区 | 呦交小u女精品视频 | 成人影院yy111111在线观看 | 国产suv精品一区二区五 | 76少妇精品导航 | 妺妺窝人体色www婷婷 | 日本一区二区三区免费高清 | 偷窥村妇洗澡毛毛多 | 玩弄中年熟妇正在播放 | 精品人妻中文字幕有码在线 | 国内少妇偷人精品视频 | 四虎国产精品免费久久 | 久久久www成人免费毛片 | 99久久人妻精品免费二区 | 曰韩少妇内射免费播放 | 野狼第一精品社区 | 久久精品国产99久久6动漫 | 欧美国产亚洲日韩在线二区 | 久热国产vs视频在线观看 | 激情人妻另类人妻伦 | 国产成人无码av片在线观看不卡 | 欧美日韩一区二区免费视频 | 亚洲精品鲁一鲁一区二区三区 | 人妻有码中文字幕在线 | 精品久久久中文字幕人妻 | 国产一区二区三区日韩精品 | 欧美xxxxx精品 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲日本在线电影 | 久久综合九色综合97网 | 欧美野外疯狂做受xxxx高潮 | 成 人影片 免费观看 | 激情人妻另类人妻伦 | 国产内射爽爽大片视频社区在线 | 十八禁真人啪啪免费网站 | 亚洲中文字幕无码中文字在线 | 无码国产色欲xxxxx视频 | 久久久久国色av免费观看性色 | 日本熟妇乱子伦xxxx | 无遮挡国产高潮视频免费观看 | 无码任你躁久久久久久久 | 久久久中文字幕日本无吗 | 国产精品va在线播放 | 国产又粗又硬又大爽黄老大爷视 | 在线a亚洲视频播放在线观看 | 永久免费观看国产裸体美女 | 一二三四社区在线中文视频 | 亚洲国产日韩a在线播放 | 国产精品亚洲五月天高清 | 少妇的肉体aa片免费 | 亚洲国产av美女网站 | 国产成人精品一区二区在线小狼 | 99精品无人区乱码1区2区3区 | 免费视频欧美无人区码 | 亚洲男人av天堂午夜在 | 大肉大捧一进一出视频出来呀 | 亚洲国产综合无码一区 | 一区二区传媒有限公司 | 网友自拍区视频精品 | 无码人妻av免费一区二区三区 | 十八禁真人啪啪免费网站 | 无码一区二区三区在线观看 | 成人影院yy111111在线观看 | 国产人妖乱国产精品人妖 | 激情内射亚州一区二区三区爱妻 | 啦啦啦www在线观看免费视频 | 老司机亚洲精品影院 | 国产精品美女久久久 | 天天av天天av天天透 | 亚洲国产精品无码一区二区三区 | 99麻豆久久久国产精品免费 | 亚洲精品一区二区三区四区五区 | 又粗又大又硬毛片免费看 | 午夜丰满少妇性开放视频 | 少妇久久久久久人妻无码 | 乱人伦人妻中文字幕无码 | 日日橹狠狠爱欧美视频 | 人妻aⅴ无码一区二区三区 | 成人亚洲精品久久久久软件 | 动漫av一区二区在线观看 | 精品国产一区av天美传媒 | 野狼第一精品社区 | 天下第一社区视频www日本 | 少妇高潮一区二区三区99 | 伊人久久大香线蕉av一区二区 | 日本www一道久久久免费榴莲 | 人妻少妇精品无码专区二区 | 爆乳一区二区三区无码 | 精品国产麻豆免费人成网站 | 四虎影视成人永久免费观看视频 | 嫩b人妻精品一区二区三区 | 国产舌乚八伦偷品w中 | 无码人妻精品一区二区三区下载 | 久久久久久九九精品久 | 免费人成在线视频无码 | 色偷偷人人澡人人爽人人模 | 精品欧洲av无码一区二区三区 | 亚洲精品中文字幕 | 99re在线播放 | 天天摸天天透天天添 | 无码帝国www无码专区色综合 | 国产精品二区一区二区aⅴ污介绍 | yw尤物av无码国产在线观看 | 99久久无码一区人妻 | 日韩成人一区二区三区在线观看 | 少妇人妻偷人精品无码视频 | 国产后入清纯学生妹 | 久久这里只有精品视频9 | 日日摸日日碰夜夜爽av | 永久黄网站色视频免费直播 | 亚洲色偷偷偷综合网 | 免费看男女做好爽好硬视频 | 无码成人精品区在线观看 | 国产精品99久久精品爆乳 | 国产香蕉97碰碰久久人人 | 亚洲一区二区三区无码久久 | 国产乱码精品一品二品 | 黑人巨大精品欧美黑寡妇 | 国产办公室秘书无码精品99 | 欧美日本精品一区二区三区 | 国产欧美精品一区二区三区 | 丰满肥臀大屁股熟妇激情视频 | 精品国产一区二区三区av 性色 | 国产精品美女久久久久av爽李琼 | 波多野结衣aⅴ在线 | 久久国产精品精品国产色婷婷 | 国产精品久久久久久久影院 | 国内精品一区二区三区不卡 | 日本一卡二卡不卡视频查询 | 国产亚洲人成在线播放 | 三上悠亚人妻中文字幕在线 | 亚洲精品综合五月久久小说 | 国产乱子伦视频在线播放 | 国产精品亚洲а∨无码播放麻豆 | 麻豆国产97在线 | 欧洲 | 亚洲欧洲日本无在线码 | 极品尤物被啪到呻吟喷水 | 久久精品国产大片免费观看 | 成年女人永久免费看片 | 人妻尝试又大又粗久久 | 人人爽人人澡人人人妻 | 精品久久久无码人妻字幂 | a片在线免费观看 | 2019nv天堂香蕉在线观看 | 国产精品igao视频网 | 久久久久亚洲精品男人的天堂 | 人妻少妇精品无码专区二区 | 国产又爽又猛又粗的视频a片 | 免费网站看v片在线18禁无码 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品久久久久无码av色戒 | 欧美xxxxx精品 | 四十如虎的丰满熟妇啪啪 | 18无码粉嫩小泬无套在线观看 | 国产亲子乱弄免费视频 | 国产两女互慰高潮视频在线观看 | 精品国产乱码久久久久乱码 | 国产av人人夜夜澡人人爽麻豆 | 撕开奶罩揉吮奶头视频 | 中文字幕av日韩精品一区二区 | 国产suv精品一区二区五 | 国产成人无码一二三区视频 | 国内少妇偷人精品视频 | 中文字幕无码日韩专区 | 国产在线一区二区三区四区五区 | 在线成人www免费观看视频 | 国产精品嫩草久久久久 | 大胆欧美熟妇xx | 女人被男人躁得好爽免费视频 | 色综合久久久无码网中文 | 丰满少妇弄高潮了www | 永久免费观看美女裸体的网站 | 国产女主播喷水视频在线观看 | 国产成人综合在线女婷五月99播放 | 国产亚洲精品久久久久久大师 | www国产亚洲精品久久久日本 | 天下第一社区视频www日本 | 国产九九九九九九九a片 | 大地资源中文第3页 | 性欧美牲交xxxxx视频 | 日韩av无码一区二区三区 | 人人妻人人澡人人爽精品欧美 | 任你躁在线精品免费 | 久久久久国色av免费观看性色 | 亚洲精品一区二区三区大桥未久 | 99精品视频在线观看免费 | 国产成人精品三级麻豆 | 成人无码视频在线观看网站 | 亚洲一区二区三区播放 | 一本大道久久东京热无码av | 日韩精品成人一区二区三区 | 成 人影片 免费观看 | 精品少妇爆乳无码av无码专区 | 麻豆精品国产精华精华液好用吗 | 兔费看少妇性l交大片免费 | 欧美大屁股xxxxhd黑色 | 成人免费视频在线观看 | 97精品人妻一区二区三区香蕉 | 无码一区二区三区在线观看 | 亚洲成熟女人毛毛耸耸多 | 伊人久久大香线焦av综合影院 | 丰满人妻翻云覆雨呻吟视频 | 国产免费久久久久久无码 | 5858s亚洲色大成网站www | 日韩精品一区二区av在线 | 久久亚洲中文字幕精品一区 | 欧美老妇交乱视频在线观看 | 亚洲国产精品久久久久久 | 日日鲁鲁鲁夜夜爽爽狠狠 | 日日天干夜夜狠狠爱 | 午夜肉伦伦影院 | 婷婷六月久久综合丁香 | 亚洲成色www久久网站 | 欧美猛少妇色xxxxx | 人人超人人超碰超国产 | 日本饥渴人妻欲求不满 | 亚洲中文无码av永久不收费 | 成年美女黄网站色大免费全看 | 亚洲欧美日韩综合久久久 | 久久人人爽人人人人片 | 国产精品多人p群无码 | 精品无码国产一区二区三区av | 青青青爽视频在线观看 | 内射后入在线观看一区 | 成人精品视频一区二区三区尤物 | 一本久久伊人热热精品中文字幕 | 亚洲国产高清在线观看视频 | 久久久www成人免费毛片 | 久久精品视频在线看15 | 欧洲极品少妇 | 欧美 亚洲 国产 另类 | 人人澡人人妻人人爽人人蜜桃 | 国产特级毛片aaaaaa高潮流水 | 日韩欧美中文字幕在线三区 | 国产极品视觉盛宴 | 国色天香社区在线视频 | 欧美精品免费观看二区 | 综合激情五月综合激情五月激情1 | 国产xxx69麻豆国语对白 | 国产小呦泬泬99精品 | 人妻天天爽夜夜爽一区二区 | 成人试看120秒体验区 | 国内少妇偷人精品视频免费 | 嫩b人妻精品一区二区三区 | 久久国产精品萌白酱免费 | 乌克兰少妇性做爰 | 精品国产aⅴ无码一区二区 | 欧美性猛交内射兽交老熟妇 | 鲁一鲁av2019在线 | 久久人人爽人人人人片 | 草草网站影院白丝内射 | 亲嘴扒胸摸屁股激烈网站 | 中文字幕无码免费久久9一区9 | 熟妇人妻中文av无码 | 久久99久久99精品中文字幕 | 无码一区二区三区在线 | 久久久久免费精品国产 | 好爽又高潮了毛片免费下载 | 国产情侣作爱视频免费观看 | 国产精华av午夜在线观看 | 男女作爱免费网站 | 麻豆国产丝袜白领秘书在线观看 | 精品偷自拍另类在线观看 | 国产艳妇av在线观看果冻传媒 | 国产精品人人妻人人爽 | 亚洲色欲色欲天天天www | 在线播放免费人成毛片乱码 | 国产精品亚洲lv粉色 | 最新国产乱人伦偷精品免费网站 | 黑人巨大精品欧美一区二区 | 小鲜肉自慰网站xnxx | 成人精品视频一区二区三区尤物 | 老太婆性杂交欧美肥老太 | 精品久久久久香蕉网 | 久久久中文字幕日本无吗 | 国产情侣作爱视频免费观看 | 任你躁国产自任一区二区三区 | 国产乱码精品一品二品 | 少妇的肉体aa片免费 | 亚洲国产精品久久久久久 | 激情综合激情五月俺也去 | 国产精品va在线观看无码 | 两性色午夜视频免费播放 | 1000部啪啪未满十八勿入下载 | 丰满护士巨好爽好大乳 | 国产成人久久精品流白浆 | 丰满肥臀大屁股熟妇激情视频 | 亚洲一区av无码专区在线观看 | 国产凸凹视频一区二区 | 国产精品亚洲lv粉色 | 国产乱人伦av在线无码 | 欧美人与牲动交xxxx | 免费乱码人妻系列无码专区 | 国产精品-区区久久久狼 | 色欲人妻aaaaaaa无码 | 大地资源中文第3页 | 一本精品99久久精品77 | 欧美熟妇另类久久久久久不卡 | 亚洲精品久久久久久久久久久 | 人人妻人人藻人人爽欧美一区 | 国产亚洲tv在线观看 | 在线亚洲高清揄拍自拍一品区 | 欧美三级不卡在线观看 | 成人一区二区免费视频 | 熟女俱乐部五十路六十路av | 黑人巨大精品欧美一区二区 | 女人被爽到呻吟gif动态图视看 | 日本精品久久久久中文字幕 | 亚洲中文无码av永久不收费 | 国内少妇偷人精品视频免费 | 久久99精品久久久久婷婷 | 性欧美牲交xxxxx视频 | 精品无人区无码乱码毛片国产 | 草草网站影院白丝内射 | 玩弄中年熟妇正在播放 | 色婷婷av一区二区三区之红樱桃 | 精品少妇爆乳无码av无码专区 | 无码人妻精品一区二区三区不卡 | 中文字幕人妻无码一区二区三区 | 精品无人区无码乱码毛片国产 | 亚洲一区av无码专区在线观看 | 一本久久a久久精品vr综合 | 久久久久久av无码免费看大片 | 精品无人国产偷自产在线 | 麻豆md0077饥渴少妇 | 伊人久久大香线蕉午夜 | 成年美女黄网站色大免费视频 | 99视频精品全部免费免费观看 | 免费观看的无遮挡av | 中文字幕人妻无码一夲道 | 亚洲一区二区三区国产精华液 | 日本免费一区二区三区最新 | 久青草影院在线观看国产 | 99麻豆久久久国产精品免费 | 亚洲日本va中文字幕 | 人妻少妇被猛烈进入中文字幕 | 欧美变态另类xxxx | 色欲久久久天天天综合网精品 | 久久久久久久久888 | 俺去俺来也www色官网 | 在线天堂新版最新版在线8 | 中文亚洲成a人片在线观看 | 国产真实夫妇视频 | 亚洲综合久久一区二区 | 妺妺窝人体色www在线小说 | 色婷婷香蕉在线一区二区 | 一区二区三区乱码在线 | 欧洲 | 1000部啪啪未满十八勿入下载 | www一区二区www免费 | 福利一区二区三区视频在线观看 | 狠狠噜狠狠狠狠丁香五月 | 精品亚洲韩国一区二区三区 | 成人亚洲精品久久久久 | 久青草影院在线观看国产 | 天天拍夜夜添久久精品大 | 亚洲爆乳大丰满无码专区 | 强伦人妻一区二区三区视频18 | 亚洲日韩中文字幕在线播放 | 国产suv精品一区二区五 | 精品国精品国产自在久国产87 | 色婷婷欧美在线播放内射 | 久久久久人妻一区精品色欧美 | 国产凸凹视频一区二区 | 中文字幕无线码 | 亚洲精品午夜无码电影网 | 国内精品人妻无码久久久影院蜜桃 | 黑森林福利视频导航 | 欧美 亚洲 国产 另类 | 国产精品久久久一区二区三区 | 国内丰满熟女出轨videos | 亚洲一区av无码专区在线观看 | а√资源新版在线天堂 | 一区二区三区乱码在线 | 欧洲 | 人妻与老人中文字幕 | 狠狠综合久久久久综合网 | 国产在线精品一区二区三区直播 | 国产区女主播在线观看 | 久久久精品国产sm最大网站 | 国产高清av在线播放 | 久久久亚洲欧洲日产国码αv | 帮老师解开蕾丝奶罩吸乳网站 | 青青青手机频在线观看 | 亚洲gv猛男gv无码男同 | 日韩亚洲欧美精品综合 | 国产无遮挡又黄又爽又色 | av在线亚洲欧洲日产一区二区 | 精品亚洲韩国一区二区三区 | 波多野结衣一区二区三区av免费 | 欧美精品在线观看 | 国产九九九九九九九a片 | 精品国产一区av天美传媒 | 一本大道久久东京热无码av | 九月婷婷人人澡人人添人人爽 | 人人超人人超碰超国产 | 国产情侣作爱视频免费观看 | 欧美熟妇另类久久久久久多毛 | 丰满诱人的人妻3 | 男女下面进入的视频免费午夜 | 成人片黄网站色大片免费观看 | 国产美女极度色诱视频www | 亚洲色无码一区二区三区 | 熟女少妇人妻中文字幕 | 亚洲国产精品一区二区美利坚 | 国产精品永久免费视频 | 亚洲人成网站色7799 | 久久精品国产99精品亚洲 | 精品久久8x国产免费观看 | 十八禁视频网站在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 领导边摸边吃奶边做爽在线观看 | 熟女少妇人妻中文字幕 | 最新版天堂资源中文官网 | 久久精品国产99精品亚洲 | 国产香蕉尹人视频在线 | 无码国产乱人伦偷精品视频 | 性开放的女人aaa片 | 樱花草在线播放免费中文 | 国产超级va在线观看视频 | 亚洲综合久久一区二区 | 无码乱肉视频免费大全合集 | 亚洲中文字幕无码一久久区 | 国产超级va在线观看视频 | 精品国产av色一区二区深夜久久 | 内射巨臀欧美在线视频 | 人妻中文无码久热丝袜 | 国产卡一卡二卡三 | 日韩欧美中文字幕公布 | 夜夜高潮次次欢爽av女 | 精品国产一区二区三区四区 | 欧美性生交活xxxxxdddd | 欧洲熟妇精品视频 | 人妻无码久久精品人妻 | www国产亚洲精品久久久日本 | 久久久久久久女国产乱让韩 | 亚洲小说图区综合在线 | 无码人妻丰满熟妇区五十路百度 | 正在播放东北夫妻内射 | 日本欧美一区二区三区乱码 | 欧美精品免费观看二区 | 亚洲精品一区二区三区婷婷月 | 女人被爽到呻吟gif动态图视看 | 少妇高潮喷潮久久久影院 | 丁香啪啪综合成人亚洲 | 欧美黑人巨大xxxxx | 国产婷婷色一区二区三区在线 | 欧洲美熟女乱又伦 | 亚洲成在人网站无码天堂 | 又大又硬又爽免费视频 | 清纯唯美经典一区二区 | 亚洲成a人片在线观看无码 | 人妻熟女一区 | 人人妻人人澡人人爽欧美精品 | 久久久久国色av免费观看性色 | 大胆欧美熟妇xx | 无码国内精品人妻少妇 | 亚洲精品一区三区三区在线观看 | 免费乱码人妻系列无码专区 | 日韩成人一区二区三区在线观看 | 亚洲 a v无 码免 费 成 人 a v | 国产精品久久久午夜夜伦鲁鲁 | av无码电影一区二区三区 | 国产卡一卡二卡三 | 国产精品对白交换视频 | 麻豆av传媒蜜桃天美传媒 | 狂野欧美激情性xxxx | 丰满护士巨好爽好大乳 | 爽爽影院免费观看 | 国产三级精品三级男人的天堂 | 又大又硬又爽免费视频 | 久久久中文久久久无码 | 国产欧美熟妇另类久久久 | 国产乡下妇女做爰 | 亚洲欧洲中文日韩av乱码 | 在线观看国产午夜福利片 | 伊人色综合久久天天小片 | 亚洲精品综合五月久久小说 | 理论片87福利理论电影 | 久久人人爽人人爽人人片ⅴ | 国产亚洲欧美在线专区 | 欧美精品免费观看二区 | 精品一二三区久久aaa片 | 亚洲国产av精品一区二区蜜芽 | 无码精品国产va在线观看dvd | 国产 精品 自在自线 | 久久国产精品萌白酱免费 | 亚洲精品鲁一鲁一区二区三区 | 亚无码乱人伦一区二区 | 久久久成人毛片无码 | 国产特级毛片aaaaaa高潮流水 | 亚洲aⅴ无码成人网站国产app | 图片小说视频一区二区 | 无套内谢的新婚少妇国语播放 | 日韩人妻无码中文字幕视频 | 大屁股大乳丰满人妻 | √8天堂资源地址中文在线 | 国产精品久久久久9999小说 | 狠狠色丁香久久婷婷综合五月 | 久久午夜无码鲁丝片午夜精品 | 日欧一片内射va在线影院 | 人人妻人人澡人人爽欧美一区九九 | 特大黑人娇小亚洲女 | 九九在线中文字幕无码 | 欧美色就是色 | 丁香啪啪综合成人亚洲 | 欧美激情一区二区三区成人 | 欧美丰满熟妇xxxx | 国产精品久久精品三级 | 奇米影视7777久久精品 | 亚洲日韩中文字幕在线播放 | 成熟女人特级毛片www免费 | 性色欲网站人妻丰满中文久久不卡 | 性啪啪chinese东北女人 | aⅴ在线视频男人的天堂 | 国产精品爱久久久久久久 | 人妻无码αv中文字幕久久琪琪布 | 国产成人精品视频ⅴa片软件竹菊 | 麻豆国产人妻欲求不满 | 在线播放免费人成毛片乱码 | 免费中文字幕日韩欧美 | 麻豆国产人妻欲求不满 | 精品久久久久久亚洲精品 | 人妻少妇精品久久 | 久久无码中文字幕免费影院蜜桃 | 一本大道伊人av久久综合 | 国产一区二区三区四区五区加勒比 | 蜜臀av无码人妻精品 | 精品国产精品久久一区免费式 | 国产人成高清在线视频99最全资源 | 中文字幕无码av波多野吉衣 | 亚洲人成无码网www | 老头边吃奶边弄进去呻吟 | 六十路熟妇乱子伦 | 国产成人精品视频ⅴa片软件竹菊 | 日本一区二区三区免费播放 | 亚洲人成人无码网www国产 | 色欲av亚洲一区无码少妇 | aⅴ亚洲 日韩 色 图网站 播放 | 精品aⅴ一区二区三区 | 综合人妻久久一区二区精品 | 女人被男人爽到呻吟的视频 | 男女超爽视频免费播放 | 人人澡人摸人人添 | 天堂亚洲免费视频 | 小sao货水好多真紧h无码视频 | 东京一本一道一二三区 | 东京热无码av男人的天堂 | 免费国产成人高清在线观看网站 | 日韩人妻少妇一区二区三区 | 99久久99久久免费精品蜜桃 | 4hu四虎永久在线观看 | 99久久精品国产一区二区蜜芽 | 丰满少妇弄高潮了www | 婷婷丁香五月天综合东京热 | 久久久久久久久888 | 国产一精品一av一免费 | 亚洲精品一区二区三区在线观看 | 偷窥村妇洗澡毛毛多 | 欧美变态另类xxxx | аⅴ资源天堂资源库在线 | 国产另类ts人妖一区二区 | 日本xxxx色视频在线观看免费 | 日本精品少妇一区二区三区 | 国产精品人妻一区二区三区四 | 性生交片免费无码看人 | 国产色精品久久人妻 | 国产午夜福利100集发布 | 天堂无码人妻精品一区二区三区 | 国产欧美熟妇另类久久久 | 熟妇人妻无乱码中文字幕 | 日韩人妻少妇一区二区三区 | 小sao货水好多真紧h无码视频 | 色欲综合久久中文字幕网 | 亚洲国产精品一区二区美利坚 | 丝袜美腿亚洲一区二区 | 精品国产av色一区二区深夜久久 | 亚洲毛片av日韩av无码 | www国产亚洲精品久久久日本 | 国产精品亚洲专区无码不卡 | 久久久久成人精品免费播放动漫 | 天堂一区人妻无码 | 精品无码成人片一区二区98 | 久久 国产 尿 小便 嘘嘘 | 永久免费观看美女裸体的网站 | 国产精品二区一区二区aⅴ污介绍 | √天堂中文官网8在线 | 无人区乱码一区二区三区 | 国产人妻精品一区二区三区不卡 | 76少妇精品导航 | 高潮毛片无遮挡高清免费视频 | 国产精品丝袜黑色高跟鞋 | a在线观看免费网站大全 | 亚洲人成网站色7799 | 亚洲 欧美 激情 小说 另类 | 国产真人无遮挡作爱免费视频 | 日韩人妻系列无码专区 | 中文毛片无遮挡高清免费 | 理论片87福利理论电影 | 日韩人妻无码一区二区三区久久99 | 性史性农村dvd毛片 | 76少妇精品导航 | 正在播放老肥熟妇露脸 | 国产亚洲视频中文字幕97精品 | 亚洲综合色区中文字幕 | 国产极品视觉盛宴 | 丰满人妻被黑人猛烈进入 | 国产精品资源一区二区 | 国产乡下妇女做爰 | 丝袜人妻一区二区三区 | aa片在线观看视频在线播放 | 水蜜桃色314在线观看 | 亚洲狠狠婷婷综合久久 | 精品aⅴ一区二区三区 | 人妻少妇精品无码专区二区 | 国产综合久久久久鬼色 | 久久综合九色综合欧美狠狠 | 性色av无码免费一区二区三区 | 黑人玩弄人妻中文在线 | 日本护士毛茸茸高潮 | 亚洲欧美日韩成人高清在线一区 | 蜜桃av抽搐高潮一区二区 | 精品国产精品久久一区免费式 | 亚洲爆乳精品无码一区二区三区 | 日本高清一区免费中文视频 | 天天综合网天天综合色 | 久久精品中文字幕大胸 | 久久久久亚洲精品中文字幕 | 1000部啪啪未满十八勿入下载 | 精品国产乱码久久久久乱码 | 亚洲精品久久久久久一区二区 | 国产莉萝无码av在线播放 | 亚洲精品美女久久久久久久 | 久久精品国产99精品亚洲 | 国产精品无码一区二区桃花视频 | 国产精品亚洲а∨无码播放麻豆 | aa片在线观看视频在线播放 | 成人免费视频一区二区 | 亚洲 激情 小说 另类 欧美 | 久久成人a毛片免费观看网站 | 国产精品自产拍在线观看 | 国产情侣作爱视频免费观看 | 亚洲精品一区二区三区四区五区 | 国产9 9在线 | 中文 | 国产无遮挡又黄又爽又色 | 亚洲人成影院在线观看 | 久青草影院在线观看国产 | 一本大道久久东京热无码av | 99精品国产综合久久久久五月天 | 最新国产乱人伦偷精品免费网站 | 18禁黄网站男男禁片免费观看 | 日韩精品无码一本二本三本色 | 国产又粗又硬又大爽黄老大爷视 | 极品嫩模高潮叫床 | 欧美 日韩 亚洲 在线 | 成人亚洲精品久久久久软件 | 国产成人无码av片在线观看不卡 | 99riav国产精品视频 | 午夜不卡av免费 一本久久a久久精品vr综合 | a在线亚洲男人的天堂 | 亚洲啪av永久无码精品放毛片 | 日本精品少妇一区二区三区 | 久久亚洲a片com人成 | 岛国片人妻三上悠亚 | 精品偷自拍另类在线观看 | 日韩无码专区 | 亚洲国产精华液网站w | 香蕉久久久久久av成人 | 婷婷色婷婷开心五月四房播播 | 日本精品高清一区二区 | 国产高清不卡无码视频 | 玩弄中年熟妇正在播放 | 未满小14洗澡无码视频网站 | 99视频精品全部免费免费观看 | 88国产精品欧美一区二区三区 | 4hu四虎永久在线观看 | 麻花豆传媒剧国产免费mv在线 | 午夜精品久久久久久久久 | 欧美怡红院免费全部视频 | 中文字幕乱妇无码av在线 | 国产午夜福利100集发布 | 亚洲欧美综合区丁香五月小说 | 波多野42部无码喷潮在线 | 麻豆蜜桃av蜜臀av色欲av | 伊人久久大香线蕉亚洲 | 骚片av蜜桃精品一区 | 中文无码精品a∨在线观看不卡 | 狂野欧美性猛交免费视频 | 激情内射亚州一区二区三区爱妻 | 丰腴饱满的极品熟妇 | 少妇高潮喷潮久久久影院 | 日韩人妻少妇一区二区三区 | 任你躁国产自任一区二区三区 | 双乳奶水饱满少妇呻吟 | 一本精品99久久精品77 | 成人亚洲精品久久久久 | 国产亚洲日韩欧美另类第八页 | 人妻尝试又大又粗久久 | a在线观看免费网站大全 | 国产亚av手机在线观看 | 亚洲精品中文字幕久久久久 | 久久无码中文字幕免费影院蜜桃 | 一二三四社区在线中文视频 | 亚洲人成网站色7799 | 又紧又大又爽精品一区二区 | 国产精品99久久精品爆乳 | 玩弄中年熟妇正在播放 | 日韩 欧美 动漫 国产 制服 | 国产亚洲美女精品久久久2020 | 无码一区二区三区在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国内精品人妻无码久久久影院蜜桃 | 国产熟女一区二区三区四区五区 | 国内少妇偷人精品视频 | 少妇人妻av毛片在线看 | 正在播放老肥熟妇露脸 | 国产97在线 | 亚洲 | 亚洲熟熟妇xxxx | 欧美老妇交乱视频在线观看 | 国产精品久久久久久亚洲影视内衣 | 久久国产精品二国产精品 | 国产熟女一区二区三区四区五区 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲の无码国产の无码步美 | 亚洲成av人影院在线观看 | 国产成人久久精品流白浆 | 99久久婷婷国产综合精品青草免费 | 亚洲国产精品毛片av不卡在线 | 妺妺窝人体色www婷婷 | 人妻人人添人妻人人爱 | 一个人免费观看的www视频 | 熟妇人妻无乱码中文字幕 | 荫蒂被男人添的好舒服爽免费视频 | 国产av剧情md精品麻豆 | 亚洲成av人片在线观看无码不卡 | 偷窥日本少妇撒尿chinese | 香蕉久久久久久av成人 | 精品一区二区三区无码免费视频 | 成人欧美一区二区三区 | 亚洲成熟女人毛毛耸耸多 | 国产精品久久久午夜夜伦鲁鲁 | 日本精品久久久久中文字幕 | 骚片av蜜桃精品一区 | 欧美自拍另类欧美综合图片区 | 亚洲欧洲日本综合aⅴ在线 | 色婷婷av一区二区三区之红樱桃 | 人人爽人人爽人人片av亚洲 | 青青草原综合久久大伊人精品 | 精品欧美一区二区三区久久久 | 午夜性刺激在线视频免费 | 欧美日韩综合一区二区三区 | 国产成人无码av在线影院 | 欧美人与物videos另类 | 欧美国产日韩久久mv | 久久久久久av无码免费看大片 | 亚洲国产av精品一区二区蜜芽 | 亚洲伊人久久精品影院 | 蜜桃视频韩日免费播放 | 我要看www免费看插插视频 | 55夜色66夜色国产精品视频 | 亚洲欧洲无卡二区视頻 | 亚洲色大成网站www | 2019午夜福利不卡片在线 | 久久99精品久久久久久动态图 | 中文字幕无线码免费人妻 | 国产人妻精品一区二区三区不卡 | 在线а√天堂中文官网 | 性欧美牲交在线视频 | 亚洲乱码中文字幕在线 | 日韩精品久久久肉伦网站 | 秋霞成人午夜鲁丝一区二区三区 | 强辱丰满人妻hd中文字幕 | 欧美zoozzooz性欧美 | 亚洲成av人影院在线观看 | 亚洲精品综合一区二区三区在线 | 男人的天堂2018无码 | 一区二区传媒有限公司 | √天堂资源地址中文在线 | 爽爽影院免费观看 | 精品国产一区二区三区四区 | 免费国产成人高清在线观看网站 | 精品一区二区三区无码免费视频 | 免费看男女做好爽好硬视频 | 欧美三级不卡在线观看 | 精品夜夜澡人妻无码av蜜桃 | 88国产精品欧美一区二区三区 | 在线成人www免费观看视频 | 亚洲狠狠婷婷综合久久 | 强奷人妻日本中文字幕 | 国产日产欧产精品精品app | 国产特级毛片aaaaaaa高清 | 中文字幕日韩精品一区二区三区 | 国产精品久久久久9999小说 | 国产片av国语在线观看 | 亚洲中文字幕无码一久久区 | 色偷偷人人澡人人爽人人模 | 人妻体内射精一区二区三四 | 色窝窝无码一区二区三区色欲 | 日日摸日日碰夜夜爽av | 亚洲一区二区三区 | 天干天干啦夜天干天2017 | 中文无码精品a∨在线观看不卡 | 国产精品丝袜黑色高跟鞋 | 人人妻人人藻人人爽欧美一区 | 色窝窝无码一区二区三区色欲 | 鲁一鲁av2019在线 | 又大又硬又黄的免费视频 | 九九久久精品国产免费看小说 | 在线欧美精品一区二区三区 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲人亚洲人成电影网站色 | 国产在线aaa片一区二区99 | 老熟妇仑乱视频一区二区 | 人人妻人人澡人人爽精品欧美 | a片免费视频在线观看 | 大地资源网第二页免费观看 | 久久久久久亚洲精品a片成人 | 国产人成高清在线视频99最全资源 | 日本一本二本三区免费 | 在线成人www免费观看视频 | 强辱丰满人妻hd中文字幕 | 欧美丰满熟妇xxxx | 久久亚洲精品成人无码 | 77777熟女视频在线观看 а天堂中文在线官网 | 丰满妇女强制高潮18xxxx | 亚洲综合色区中文字幕 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 高清不卡一区二区三区 | 欧美一区二区三区视频在线观看 | 国产九九九九九九九a片 | 欧美freesex黑人又粗又大 | 久久综合网欧美色妞网 | 欧美乱妇无乱码大黄a片 | 女人被男人爽到呻吟的视频 | 国产精品亚洲综合色区韩国 | 中文字幕av日韩精品一区二区 | 噜噜噜亚洲色成人网站 | 亚洲人成网站免费播放 | 性史性农村dvd毛片 | 午夜福利试看120秒体验区 | 欧美丰满少妇xxxx性 | 99久久无码一区人妻 | 丝袜 中出 制服 人妻 美腿 | 中文字幕av无码一区二区三区电影 | 免费人成网站视频在线观看 | 成人av无码一区二区三区 | 国产舌乚八伦偷品w中 | 88国产精品欧美一区二区三区 | 国产成人精品三级麻豆 | 亚洲精品一区二区三区在线 | 国产亚洲精品久久久久久久久动漫 | 久久久久se色偷偷亚洲精品av | 四虎永久在线精品免费网址 | 日韩成人一区二区三区在线观看 | 国产亚洲精品久久久久久国模美 | 亲嘴扒胸摸屁股激烈网站 | 美女毛片一区二区三区四区 | 亚洲无人区一区二区三区 | 亚拍精品一区二区三区探花 | 国产两女互慰高潮视频在线观看 | 欧美日韩色另类综合 | 久久国内精品自在自线 | 国产三级精品三级男人的天堂 | 精品国产青草久久久久福利 | 欧美熟妇另类久久久久久多毛 | 中文字幕色婷婷在线视频 | 国产亚洲人成a在线v网站 | 国产九九九九九九九a片 | a片在线免费观看 | 成人精品一区二区三区中文字幕 | 国产一区二区三区精品视频 | 国产乱人无码伦av在线a | 亚洲国产精品久久久天堂 | 中文字幕日产无线码一区 | 国内精品人妻无码久久久影院蜜桃 | 乱码av麻豆丝袜熟女系列 | 丰满少妇熟乱xxxxx视频 | 成人欧美一区二区三区黑人 | 精品久久久中文字幕人妻 | 亚洲欧美色中文字幕在线 | 老太婆性杂交欧美肥老太 | 国产亚洲美女精品久久久2020 | 久久无码人妻影院 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产在线aaa片一区二区99 | 午夜时刻免费入口 | 国产成人综合在线女婷五月99播放 | 男人扒开女人内裤强吻桶进去 | 精品一区二区三区波多野结衣 | 亚洲欧美日韩成人高清在线一区 | 亚洲精品一区二区三区在线 | 狠狠噜狠狠狠狠丁香五月 | 国产性生交xxxxx无码 | 噜噜噜亚洲色成人网站 | 成人试看120秒体验区 | 99久久久国产精品无码免费 | 国产精品a成v人在线播放 | 激情亚洲一区国产精品 | 国产成人综合美国十次 | 青青草原综合久久大伊人精品 | 亚洲成av人片在线观看无码不卡 | 在线观看欧美一区二区三区 | 欧洲精品码一区二区三区免费看 | a在线观看免费网站大全 | 蜜桃臀无码内射一区二区三区 | 亲嘴扒胸摸屁股激烈网站 | av人摸人人人澡人人超碰下载 | 欧美性猛交xxxx富婆 | 亚洲精品国产第一综合99久久 | 图片小说视频一区二区 | 亚洲综合无码一区二区三区 | 欧洲熟妇色 欧美 | 精品午夜福利在线观看 | 国产舌乚八伦偷品w中 | 樱花草在线社区www | √天堂资源地址中文在线 | 国产午夜福利亚洲第一 | 综合人妻久久一区二区精品 | 天天做天天爱天天爽综合网 | 无码国内精品人妻少妇 | 美女扒开屁股让男人桶 | 永久黄网站色视频免费直播 | 红桃av一区二区三区在线无码av | 亲嘴扒胸摸屁股激烈网站 | 亚洲毛片av日韩av无码 | 一本色道久久综合亚洲精品不卡 | 亚洲天堂2017无码 | 四虎影视成人永久免费观看视频 | 国产激情无码一区二区 | 国产精品无码一区二区三区不卡 | 大地资源网第二页免费观看 | 欧美第一黄网免费网站 | 波多野42部无码喷潮在线 | 国产精品成人av在线观看 | 天天拍夜夜添久久精品 | 中文字幕无码免费久久99 | 国产精品资源一区二区 | 欧美一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 少妇厨房愉情理9仑片视频 | 九九久久精品国产免费看小说 | 日本一卡二卡不卡视频查询 | 九九在线中文字幕无码 | 中文字幕av日韩精品一区二区 | 国产激情无码一区二区app | 国产三级久久久精品麻豆三级 | 亚洲精品一区二区三区在线观看 | 亚洲精品一区国产 | 久久精品一区二区三区四区 | 午夜嘿嘿嘿影院 | 欧美肥老太牲交大战 | 国产精品毛片一区二区 | 久久综合久久自在自线精品自 | 青青青手机频在线观看 | 精品午夜福利在线观看 | 人妻aⅴ无码一区二区三区 | 夜夜影院未满十八勿进 | 亚洲日韩av片在线观看 | 国产乱人偷精品人妻a片 | yw尤物av无码国产在线观看 | 久久伊人色av天堂九九小黄鸭 | 18无码粉嫩小泬无套在线观看 | 国产舌乚八伦偷品w中 | 国产绳艺sm调教室论坛 | 狠狠色丁香久久婷婷综合五月 | 丰满人妻精品国产99aⅴ | 麻豆md0077饥渴少妇 | 天堂亚洲免费视频 | av无码久久久久不卡免费网站 | 中文字幕无码av波多野吉衣 | 少妇无码av无码专区在线观看 | 强开小婷嫩苞又嫩又紧视频 | 亚洲区欧美区综合区自拍区 | 日日摸日日碰夜夜爽av | 露脸叫床粗话东北少妇 | 精品夜夜澡人妻无码av蜜桃 | 无码人妻丰满熟妇区毛片18 | 一区二区三区乱码在线 | 欧洲 | 亚洲精品一区二区三区在线 | 在线观看国产午夜福利片 | √天堂中文官网8在线 | 久久亚洲a片com人成 | 日韩人妻无码中文字幕视频 | 精品无人区无码乱码毛片国产 | 中文字幕中文有码在线 | 一区二区传媒有限公司 | 99久久99久久免费精品蜜桃 | 2020最新国产自产精品 | 无码人妻丰满熟妇区五十路百度 | 亚洲乱码国产乱码精品精 | 久热国产vs视频在线观看 | 国产麻豆精品一区二区三区v视界 | 动漫av网站免费观看 | 久久久国产精品无码免费专区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 香港三级日本三级妇三级 | 久久成人a毛片免费观看网站 |