代理的基本使用(delegate)

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可以随意更改自己的成员变量。

推荐阅读更多精彩内容