協(xié)議概述
Swift中的協(xié)議用于定義方法和屬性毫玖,
但協(xié)議本身并不進(jìn)行實現(xiàn)廉沮,而是采納該協(xié)議的類具體實現(xiàn)逮壁。
協(xié)議的定義
protocol Preson{
//協(xié)議內(nèi)容
}
協(xié)議對屬性的要求
1.對于可讀可寫的的屬性孵坚,則實現(xiàn)屬性不能是常量存儲屬性或只讀的存儲屬性
2.對于只讀的屬性,則實現(xiàn)屬性可以是任意類型的屬性窥淆。
3.允許為只讀屬性實現(xiàn)有效的set方法卖宠。
協(xié)議對方法的要求
1.方法不需要方法體
2.方法不可以有名默認(rèn)值
//(協(xié)議的定義)
protocol Preson{
var name:String{get set}
var age:Int{get}
func feed(food:String)
func shout(sound:String)
}
協(xié)議的遵循
協(xié)議的規(guī)則要用來進(jìn)行遵循。
class 類:父類忧饭,協(xié)議{
}
含義:類繼承某個父類扛伍,同時遵循協(xié)議
實現(xiàn)協(xié)議中的屬性
1、屬性可以設(shè)置默認(rèn)值
2眷昆、協(xié)議中屬性為可讀可寫蜒秤,必須聲明為var
3、協(xié)議中屬性為可讀的亚斋,實現(xiàn)中可以聲明let或者var
實現(xiàn)協(xié)議中的方法
1作媚、方法中的參數(shù)可以傳默認(rèn)值
//(協(xié)議的定義)
protocol Preson{
var name:String{get set}
var age:Int{get}
func feed(food:String)
func shout(sound:String)
}
//(協(xié)議的遵循)
class Cat:Preson{
var name:String = "heihei"
let age:Int = 18
func feed(food:String){
print("feed\(food)")
}
func shout(sound:String = "xiaohei"){
print("shout\(sound)")
}
}
協(xié)議的繼承
協(xié)議之間可以繼承,它的語法格式與類的繼承相似帅刊,
不同的是纸泡,協(xié)議可以同時繼承自多個協(xié)議也就是多繼承。
protocol Protocol1{
func playBasketball()
func playFootball()
}
//讓第二個協(xié)議去繼承第一個協(xié)議相當(dāng)于3個協(xié)議
protocol Protocol2:Protocol1{
func studyJava()
}
//實現(xiàn)幾個方法赖瞒? 實現(xiàn)協(xié)議中的所有方法
class Student:Protocol2{
func studyJava() {
<#code#>
}
func playBasketball() {
<#code#>
}
func playFootball() {
<#code#>
}
}
協(xié)議中方法可選
在方法前添加@objc optional;在協(xié)議前用@objc修飾
注意:@objc實在foundation框架中女揭,如果注釋掉import 會報錯
@objc protocol Protocol1{
@objc optional func playBasketball()
func playFootball()
}
class Student:Protocol1{
func playFootball() {
<#code#>
}
}
協(xié)議的運(yùn)用
代理模式的基礎(chǔ)就是協(xié)議
比如生活中我們可以委托別人幫我們?nèi)ジ梢患?/p>
protocol BuyVegetabalesProtocol{//凡是實現(xiàn)這個協(xié)議的人,我都可以讓他幫我買菜
func buyVegetabales()
}
class PenYou:BuyVegetabalesProtocol{
func buyVegetabales() {
print("朋友去買菜")
}
}
class JiaRen:BuyVegetabalesProtocol{
func buyVegetabales() {
print("家人去買菜")
}
}
class Boss{
var delegate:BuyVegetabalesProtocol
init(delegate:BuyVegetabalesProtocol) {
self.delegate = delegate
}
func gotoBJ(){
//買菜
delegate.buyVegetabales()
print("菜到手栏饮,去做美食")
}
}
var boss = Boss(delegate: JiaRen())
boss.gotoBJ()
boss = Boss(delegate:PenYou())
boss.gotoBJ()