由于项目中要开始转想 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? 去声明你的代理属性,避免循环引用问题