在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
@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) } }
|
请发表评论