zoukankan      html  css  js  c++  java
  • swift协议的使用方法和注意事项

    • 协议设置的方法都是必须执行的,如果设置可以选,可以使用optional,但是协议前需要加上@objc,协议的方法也需要加上@objc,不然报错
    • 如果没有optional的函数,则不需要加@objc
    • 就算协议里面声明了get 和 set方法,还是以类声明的属性为主,不然就会报错
    @objc protocol pro1 {
        //这里需要的知道的是 var parm1:Int {set}错误 声明的时候get必须有,set不一定有  var parm1:Int 也是错误的,至少加一个get
        var parm1:Int {get set}
        var parm2:Int {get}
        var parm3:Int {get set}
        //optional 说明这个是可以继承可以不用执行方法
        @objc optional func fun1(aa: Int)->Void
        //optional没有声明的方法,都是必须执行的,不然就会报错
        func fun2()->Void
    }
    class AAA:NSObject, pro1 {
        //因为fun1设置了optional,所以执行不执行都可以
        func fun1() {
            
        }
        //如果这里不执行就会报错
        func fun2() {
            
        }
        var parm1: Int = 10
        var parm2: Int = 0
        let parm3: Int = 0//报错,因为parm3是let,没有set方法
    }
    let a1 = AAA();
    a1.parm1 = 5
    a1.parm2 = 6;//var parm2:Int {get} 虽然这里只有get,但是因为类属性的申明的方法是var,所以这里没有问题,如果用let声明,这里会会报错
    //a1.parm3 = 7//报错,虽然协议里面使用get set声明,但是类使用let声明的,所以这里就是报错
    print(a1.parm1)//5
    print(a1.parm2)//6
    

    使用协议传值以及可能踩的坑

     这里是

    首先协议声明FirstVC跳转到TwoVC,然后TwoVC返回到FirstVC给FirstVC传值

    @objc protocol ProDelegate {
        //optional 说明这个是可以继承可以不用执行方法
        @objc optional func fun1(aa: Int)
        //optional没有声明的方法,都是必须执行的,不然就会报错
        func fun2(value:String)->Void
    }
    

     FirstVC的代码

    class FirstVC: UIViewController,ProDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
           
        }
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            let twoVC = TwoVC()
            twoVC.delegate = self
            self.navigationController?.pushViewController(twoVC, animated: true)
        }
        
    //    MARK ProDelegate
        //optional 说明这个是可以继承可以不用执行方法
    //    func fun1(aa: Int)->Void{
    //        print(aa)//20
    //    }
        //optional没有声明的方法,都是必须执行的,不然就会报错
        func fun2(value:String)->Void{
    //        print(value)//好人一生平安
        }
    
    }
    

     TwoVC的代码

    class TwoVC: UIViewController {
    
        weak var delegate: ProDelegate?//这里weak不能少,不然会循环引用
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.title = "two"
            self.view.backgroundColor = UIColor.blue
            
        }
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            if self.delegate != nil{
                self.delegate?.fun2(value: "好人一生平安")//这里的?可以改成!,因为已经判断了delegate存在了
            }
            if self.delegate != nil{
                self.delegate?.fun1?(aa: 20)
                //self.delegate?.fun1!(aa: 20) 如果func后是叹号,说明fun1必须调用,如果FirstVC没有实现该方法,就会报错
            }
            self.navigationController?.popViewController(animated: true)
        }
    
    }
    
  • 相关阅读:
    【洛谷P1558】色板游戏
    【SCOI2010】序列操作
    Windows下MySQL下载安装、配置与使用
    Redis和MySQL数据同步及Redis使用场景
    python的设计模式之MVC模式
    python 面试真题
    python调用C语言
    一次跨域请求出现 OPTIONS 请求的问题及解决方法
    服务器宕机问题
    页面静态化
  • 原文地址:https://www.cnblogs.com/hualuoshuijia/p/11658449.html
Copyright © 2011-2022 走看看