Swift4.0 如何正确的写Delegate 模式

由于项目中要开始转想 swift4.0了,说一下Delegate 在swift中使用方式。

@objc protocol AADelegate{

    func okAction()  //必须方法

    @objc optional func clickAction() //可选方法

}


    weak var  delegate: AADelegate?

 

   //执行代理时

   if let delegateOK = self.delegate{

       delegateOK.clickAction()

       delegateOK.clickAction?()

   }



一、在声明的protocol中为什么要用  @objc 呢? 
因为 Swift 的 protocol 是可以除了 class 以外的其他类型遵守的,而对于像 struct 或是 enum 这样的类型,本身就不通过引用计数来管理内存,所以也不可能用 weak 这样的 ARC 的概念来进行修饰。
想要在 Swift 中使用 weak delegate,我们就需要将 protocol 限制在 class 内。一种做法是将 protocol 声明为 Objective-C 的,这可以通过在 protocol 前面加上 @objc 关键字来达到,Objective-C 的 protocol 都只有类能实现,因此使用 weak 来修饰就合理了(喵大 有详情的介绍 : http://swifter.tips/delegate/)
二、为什么要 delegateOK.clickAction?() 中要有个问号呢
原因是在OC的代码中, 用respondsToSelector()方法来判断是否实现了方法。
而在swift 中就直接可以用 ? 来判断是否实现了方法。有时系统可能会给你自动提示,然后你就fix 一下,系统给你添加了个 ! 符合。但是 !符合的意思是一定实现的意思。
三、一定要 weak var  delegate: AADelegate?  去声明你的代理属性,避免循环引用问题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值