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)
    }

}
原文地址:https://www.cnblogs.com/hualuoshuijia/p/11658449.html