Swift 协议的使用

该记录采用的是Swift 3.0版本,Xcode8.2.1,配合某机构教学视频。


Swift中协议的使用和OC中协议的使用,大同小异。

Swift协议

定义协议

// 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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值