協(xié)議的格式
- 協(xié)議的定義方式與類忙上,結(jié)構(gòu)體,枚舉的定義都非常相似
protocol SomeProtocol {
// 協(xié)議方法
}
- 遵守協(xié)議的格式
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
// 類的內(nèi)容
// 實現(xiàn)協(xié)議中的方法
}
協(xié)議的基本使用
- 定義協(xié)議和遵守協(xié)議
// 1.定義協(xié)議
protocol SportProtocol {
func playBasketball()
func playFootball()
}
// 2.遵守協(xié)議
// 注意:默認情況下在swift中所有的協(xié)議方法都是必須實現(xiàn)的,如果不實現(xiàn),則編譯器會報錯
class Person : SportProtocol {
var name : String?
var age : Int = 0
// 實現(xiàn)協(xié)議中的方法
func playBasketball() {
print("人在打籃球")
}
func playFootball() {
print("人在踢足球")
}
}
- 協(xié)議之間的繼承
protocol CrazySportProtocol {
func jumping()
}
protocol SportProtocol : CrazySportProtocol {
func playBasketball()
func playFootball()
}
代理設(shè)計模式
- 協(xié)議繼承用于代理設(shè)計模式
protocol BuyTicketProtocol : NSObjectProtocol {
func buyTicket()
}
class Person {
// 1.定義協(xié)議屬性
weak var delegate : BuyTicketProtocol
// 2.自定義構(gòu)造函數(shù)
init (delegate : BuyTicketProtocol) {
self.delegate = delegate
}
// 3.行為
func goToBeijing() {
delegate.buyTicket()
}
}
class HuangNiu: BuyTicketProtocol {
func buyTicket() {
print("買了一張火車票")
}
}
let p = Person(delegate: HuangNiu())
p.goToBeijing()
協(xié)議中方法的可選
// 1.定義協(xié)議
@objc protocol SportProtocol {
func playBasketball()
@objc optional func playFootball()
}
// 2.遵守協(xié)議
class Person : SportProtocol {
var name : String?
var age : Int = 0
// 實現(xiàn)協(xié)議中的方法
func playBasketball() {
print("人在打籃球")
}
}
- 注意:
- 要實現(xiàn)協(xié)議可選方法桥帆,上面代碼示例中的兩個 @objc 不能少,否則會報錯如下:
error: 'optional' can only be applied to members of an @objc protocol
optional func playFootball()
^
error: 'optional' requirements are an Objective-C compatibility feature; add '@objc'
optional func playFootball()
^
@objc
協(xié)議的使用注意
- 協(xié)議的瘦身
定義 Swift 中的協(xié)議時账嚎,為了優(yōu)化性能克滴,可以不繼承 NSObjectProtocol 協(xié)議,因為 NSObjectProtocol 中默認實現(xiàn)了很多方法熄驼,而這些方法我們不一定會用到像寒,可以等需要時在繼承烘豹。
但會出現(xiàn)下面的問題:
swift代理weak修飾報錯.png
報錯意思是:weak 只能修飾 class 和 class-bound protocol 類型。
我自定義的協(xié)議 MainViewControllerDelegate 沒有繼承 NSObjectProtocol诺祸,所以自然也就不是 class-bound protocol 類型携悯,也就不能用 weak 修飾。但不用 weak 修飾筷笨,又可能會造成循環(huán)引用的問題憔鬼。
解決:
可以繼承 class 類型
import UIKit
protocol MainViewControllerDelegate : class {
func deleFuc1() -> Int
}
class MainViewController: UIViewController {
// 這里的 weak 不會報錯
weak var delegate : MainViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
}
其他資料
- 系列文章
01 Swift最基本的語法變化
02 Swift中的變量和常量
03 Swift中的數(shù)據(jù)類型
04 Swift邏輯分支
05 Swift中的循環(huán)
06 Switf中的字符串
07 Swift 數(shù)組
08 Swift字典
09 Swift 元組
10 Swift 可選類型
11 Swift 類型轉(zhuǎn)化
12 Swift 函數(shù)
13 Swift 枚舉類型
14 Swift 結(jié)構(gòu)體
15 Swift 類的定義
16 Swift 類的構(gòu)造函數(shù)
17 Swift 類的析構(gòu)函數(shù)
18 自動引用計數(shù)
19 Swift 可選鏈
20 協(xié)議
21 閉包
22 Swift 懶加載
23 Swift 注釋