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)
}
}
浙公网安备 33010602011771号