1.基本使用
(1)定义一个协议
protocol TryShowDelegate {
func returnString()
func returnShowString(str:String)
}
(2)定义一个代理属性,遵守协议
class ViewController:UIViewController,TryShowDelegate{
var delegate:TryShowDelegate?
}
(3)判断代理是否实现,调用
delegate?.returnString()
delegate?.returnShowString(str:"这样的啊")
(4)方法的实现
func returnShowString(str:String) {
print(str)
}
func showMessage() {
print("showMessage")
}
2.swift可选代理
如上,swift代理的声明和使用,还是感觉比oc要简洁很多,但是,swift现在是没有可选代理的,也就是说,你代理中,定义的方法,每一个都要在调用者中进行实现,不然无法编译。
@objc protocol showMessageDelegate {
func showMessage()// 必须实现的方法
@objc optionalfuncshowOpttionShowMessage()// 可选实现的方法
}
class ViewController:UIViewController,TryShowDelegate,showMessageDelegate{
var showDelegate:showMessageDelegate?
}
showDelegate=self
showDelegate?.showMessage()
//showDelegate?.showOpttionShowMessage!()
func showMessage() {
print("showMessage")
}
//func showOpttionShowMessage() {
//print("showOpttionShowMessage")
//}
3.将protocol的方法声明为mutating
swift的protocol不仅可以被class实现,也适用于struct 和 enum。因为这个原因,我们在给别人用哪个协议的时候就要多考虑是否用mutating修饰。mutating 关键字修饰方法是为了能够该方法中修改struct或是emum的变量,如果没在协议里写mutating的话,别人用struct或者是enum来实现协议的话,就不能改变自己的变量了
protocol Vehicle {
var numberOfWheels:Int{get}
var color:UIColor{get set}
mutating func changeColor()
}
struct MyCar:Vehicle{
let numberOfWheels:Int=4
var color =UIColor.blue
mutating func changeColor() {
color= .red
}
}
如果把protocol定义中的mutating去掉的话,MyCar就不能编译成功,另外在使用class就不需要添加mutating修饰,因为class可以随意更改自己的成员变量。