1. 協(xié)議的格式
協(xié)議的定義方式與類,結(jié)構(gòu)體佑力,枚舉的定義都非常相似
協(xié)議默認(rèn)可以被類/結(jié)構(gòu)體/枚舉類型遵守
格式:
protocol 協(xié)議名稱 {
// 協(xié)議方法
}
protocol 協(xié)議名稱 : 父協(xié)議1,父協(xié)議2,..., {
// 協(xié)議方法
}
2. 協(xié)議的基本使用
- 定義協(xié)議和遵守協(xié)議
- 注意: 默認(rèn)情況下在swift中所有的協(xié)議方法都是必須實(shí)現(xiàn)的,如果不實(shí)現(xiàn),則編譯器會(huì)報(bào)錯(cuò)
// 1.定義協(xié)議
// 注意:默認(rèn)情況下在swift中所有的協(xié)議方法都是必須實(shí)現(xiàn)的,如果不實(shí)現(xiàn),則編譯器會(huì)報(bào)錯(cuò)
// 如果繼承自基協(xié)議可以繼承自NSObjectProtocol
protocol SportProtocol {
// 協(xié)議中的方法, 要求遵守協(xié)議者, 必須實(shí)現(xiàn), 不實(shí)現(xiàn)則直接報(bào)錯(cuò)
func playBasketball()
func playFootball()
}
// 2.遵守協(xié)議
// 定義一個(gè)類,讓類遵守協(xié)議
class Person : SportProtocol {
// 遵守協(xié)議, 必須實(shí)現(xiàn)協(xié)議中方法, 不實(shí)現(xiàn)則直接報(bào)錯(cuò)
func playBasketball() {
print("打籃球")
}
func playFootball() {
print("踢足球")
}
}
- 協(xié)議之間的繼承
- 如果繼承自基協(xié)議可以繼承自NSObjectProtocol
protocol CrazySportProtocol {
func jumping()
}
protocol SportProtocol : CrazySportProtocol {
func playBasketball()
func playFootball()
}
3. 代理設(shè)計(jì)模式
- 協(xié)議繼承用于代理設(shè)計(jì)模式
- 協(xié)議默認(rèn)可以被類/結(jié)構(gòu)體/枚舉類型遵守
- 要讓類中的屬性使用
weak
修飾, 并遵守某協(xié)議, 則某協(xié)議一定要指定只能被類遵守, 則需要協(xié)議繼承自class
協(xié)議, 即是名稱后面加上關(guān)鍵字class
, 如下代碼:
// : class : 表示該協(xié)議只能被類遵守,不能被結(jié)構(gòu)體/枚舉類型遵守
protocol BuyTicketProtocol : class {
func buyTicket()
}
class Person {
var name : String = ""
// 使用 weak 修飾遵循協(xié)議的屬性, 則該協(xié)議必須遵循 class 協(xié)議,
// 如果沒有遵循該協(xié)議則直接報(bào)錯(cuò)
weak var delegate : BuyTicketProtocol?
//可以在定義屬性或者變量的時(shí)候在協(xié)議名稱后面添加問號(hào)`?`表示是可選類型,
//表示該屬性可以沒有代理
func goToBeijing() {
// 1.買火車票
// 2.乘車去北京
print("坐車去北京")
}
}
class HuangNiu : BuyTicketProtocol {
func buyTicket() {
print("幫客戶買一張票")
}
}
let p = Person(delegate: HuangNiu())
p.goToBeijing()
4. 協(xié)議中方法的可選
- swift 是非常嚴(yán)謹(jǐn)?shù)恼Z言, 協(xié)議中的方法必須都要實(shí)現(xiàn), 如果非要出現(xiàn)可選型的方法, 則需要將 Swift 的語言轉(zhuǎn)為 OC 的語法, 需要用到關(guān)鍵字
@objc
和optional
, 示例如下:
// 1.定義協(xié)議
@objc
protocol SportProtocol {
func playBasketball()
optional func playFootball()
}
// 2.遵守協(xié)議
class Person : SportProtocol {
var name : String?
var age : Int = 0
// 實(shí)現(xiàn)協(xié)議中的方法
@objc func playBasketball() {
print("人在打籃球")
}
}