前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS - Swift 创建代理协议的多种方式

iOS - Swift 创建代理协议的多种方式

作者头像
LinXunFeng
发布2018-06-29 15:18:10
4370
发布2018-06-29 15:18:10
举报
文章被收录于专栏:LinXunFeng的专栏LinXunFeng的专栏

�假如有一个类为 LXFView,现在要为这个类创建一个代理协议,我们该如何做呢?

首先,代理协议的命名方式:类名 + Delegatev

代码语言:javascript
复制
protocol LXFViewDelegate {
    func view(_ view: LXFView)
}

当我们创建的协议遵守其它协议的情况下,只是这样写并不会报错,接下来我们在LXFView中添加一个代理属性,为避免循环引用,代理属性需要用weak修饰

代码语言:javascript
复制
class LXFPageView: UIView {
    
    weak var delegate: LXFViewDelegate?
    
}

此时就报错了,提示如下

代码语言:javascript
复制
'weak' may only be applied to class and class-bound protocol types, not 'LXFViewDelegate'

报错

意思是weak只能修饰一个类或者类绑定协议的类型

正如提示一样,我们当前的代理并非是一个类或者类绑定协议的类型 当前我们这个协议不仅可以被类遵守,还可以被结构体和枚举所遵守(这里不演示了),这无法达到weak的要求,那怎么办呢?

解决�办法有两个:

  • 办法1

直接在协议的后面写上【: class】或者【: NSObjectProtocol】

代码语言:javascript
复制
protocol LXFPageViewDelegate: class
// 或者
protocol LXFPageViewDelegate: NSObjectProtocol

class

这种方式下推荐【: class】,相比之下更为轻量级

  • 办法2 在protocol前面加上【@objc】,表示objc类型的协议
代码语言:javascript
复制
@objc protocol LXFPageViewDelegate

objc

这种方式下的优点是协议中的方法不强制实现

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.05.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档