美文网首页
代理的基本使用(delegate)

代理的基本使用(delegate)

作者: 傻傻小萝卜 | 来源:发表于2017-10-16 17:11 被阅读40次

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

    相关文章

      网友评论

          本文标题:代理的基本使用(delegate)

          本文链接:https://www.haomeiwen.com/subject/raakuxtx.html