• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

swift协议的使用方法和注意事项

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  • 协议设置的方法都是必须执行的,如果设置可以选,可以使用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)
    }

}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Swift&amp;OC混编浅析发布时间:2022-07-13
下一篇:
支持swift的创建的flutter项目按目前配置,不能正常显示地图发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap