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