该记录采用的是Swift 3.0版本,Xcode8.2.1,配合某机构教学视频。
Swift中协议的使用和OC中协议的使用,大同小异。
定义协议
// Swift中定义协议: protocol VisitorViewDelegate: class { /// 登录回调 func loginBtnWillClick() /// 注册回调 func registerBtnWillClick() }定义代理属性
// Swift也需要加上weak,避免循环引用。注意如果协议不遵守class,直接用weak修饰会报错 weak var delegate:VisitorViewDelegate?从报错信息我们可以看到,weak只能用来修饰类类型,和类绑定的协议(我理解为在类中声明的协议)。在Swift中不单单只有类类型能遵守协议,结构体或枚举都可以遵守,查阅官方文档(中文版)后,
当协议定义的要求需要遵循协议的类型必须是引用语义而非值语义时,应该采用类类型专属协议
但是这里为什么写的是:class而不是:NSObjectProtocol。关于这一点暂时还有明白,查看UITableViewDelegate和DataSource可以看到都是遵守NSObjectProtocol。看到比较靠谱的说法,
1.使用:NSObjectProtocol是继承自NSObject的类 2.Swift中的协议方法是必须全部实现的,如果要声明成为可选方法,那就使用:NSObjectProtocol,配合@objc。
留待后续处理。如果有知道的朋友,也可以在下方留言评论。
代理执行方法
// Swift中可选项delegate为nil时,不会执行loginBtnWillClick(),所以不会造成崩溃,这点区别于OC,需要判断delegate是否为空、能否响应代理方法 delegate?.loginBtnWillClick()使用到协议的控制器需要VisitorViewDelegate
// 遵守协议 class BaseTableViewController: UITableViewController,VisitorViewDelegate // 设置代理 private func setupVisitorView() { let customView = VisitorView() view = customView; customView.delegate = self visitorView = customView } // 实现协议方法 func loginBtnWillClick() { print(#function) }