協定:是多個類共享的一個方法清單。協定中列出的方法沒有相應的實作,計劃由其他人來實作。協定中列出的方法,有些是可以選擇實作,有些是必須實作。
1>、如果你定義了自己的協定,那麼不必由自己實作它。但是,這就告訴其他程式員,如果要采用這項協定,則必須實作這些方法。這些方法可以從超類繼承。
協定不引用任何類,它是無類的。
分類也可以采用一項協定。
2>、定義一個協定很簡單:隻要使用 @protocol 指令,後面跟上你給出的協定名稱。定義一項協定時,可以擴充現有協定的定義。
3>、協定的修飾
4>、協定的聲明
5>、協定的檢查
非正式協定:實際上是一個分類,列出了一組方法但并沒有實作它們。非正式協定通常是為根類定義的,有時,非正式協定也稱為抽象協定。
聲明非正式協定的類自己并不實作這些方法,并且選擇實作這些方法的子類需要在它的接口部分重新聲明這些方法,同時還要實作這些方法中的一個或多個。
指令 @optional 添加到 OC 2.0 語言中,用于取代非正式協定的使用。
代理:協定也是一種兩個類之間的接口定義。定義了協定的類可以看作是将協定定義的方法代理給了實作它們的類。
代理設計模式的作用:
1、A 對象監聽 B 對象的一些行為,A 成為 B 的代理
2、B 對象想告訴 A 對象一些事情,A 成為 B 的代理
代理設計模式的總結:
1、如果你想監聽别人的一些行為,那麼你就要成為别人的代理
2、如果你想告訴别人一些事情,那麼就讓别人成為你的代理
代理設計模式的開發步驟:
1、拟一份協定(協定名字的格式:控件名 + Delegate),在協定裡面聲明一些代理方法(一般代理方法都是 @optional)
2、聲明一個代理屬性:@property (nonatomic, weak) id delegate;
3、在内部發生某些行為時,調用代理對應的代理方法,通知代理内部發生什麼事
4、設定代理:xxx.delegate = yyy;
5、yyy 對象遵守協定,實作代理方法
代理和通知的差別:
代理:1 個對象隻能告訴另 1 個對象發生了什麼事
通知:1 個對象可以告訴 N 個對象發生了什麼事
代理 - 反向傳值
1、建立代理協定,并在協定中建立協定方法
2、委托方:發送方,包含協定頭檔案
3、委托方:發送方,建立代理人屬性變量
4、委托方:發送方,調用協定方法,發送傳遞值
5、代理方:接收方,遵守代理協定
6、代理方:接收方,執行個體化發送方對象,并設定其代理人為 self
7、代理方:接收方,實作代理協定中的方法,接收傳遞值
Objective-C
PageDelegate1.h
Page8.h
Page8.m
Page7.m
Swift
PageDelegate1.swift
Page8.swift
Page7.swift
代理 - 反向傳值,代理封裝
4、委托方:發送方,聲明重構的 init 初始化方法
5、委托方:發送方,重構 init 初始化方法
6、委托方:發送方,調用協定方法,發送傳遞值
7、代理方:接收方,遵守代理協定
8、代理方:接收方,用重構初始化方法執行個體化委托方對象,并設定其代理人為 self
9、代理方:接收方,實作代理協定中的方法,接收傳遞值
PageDelegate2.h
Page10.h
Page10.m
Page9.m
PageDelegate2.swift
Page10.swift
Page9.swift