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

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

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

protocol LXFViewDelegate {
    func view(_ view: LXFView)
}

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

class LXFPageView: UIView {
    
    weak var delegate: LXFViewDelegate?
    
}

此时就报错了,提示如下

'weak' may only be applied to class and class-bound protocol types, not 'LXFViewDelegate'

报错

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

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

解决�办法有两个:

  • 办法1

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

protocol LXFPageViewDelegate: class
// 或者
protocol LXFPageViewDelegate: NSObjectProtocol

class

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

  • 办法2 在protocol前面加上【@objc】,表示objc类型的协议
@objc protocol LXFPageViewDelegate

objc

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极客慕白的成长之路

前端知识点总结 : Vue

作用:将表达式执行的结果 输出当调用元素的innerHTML中;还可以将数据绑定到视图。

341
来自专栏深度学习之tensorflow实战篇

交互式使用 R题(shell)

交互式使用 R 交互式shell是一种很方便的环境,可以进行各种尝试,随时调整过程。与Python、Ruby等语言一样,R也提供了shell环境。本文开始的例子...

2995
来自专栏我的博客

Sed详解

1、说明 sed 一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令...

30210
来自专栏天天

微信小程序中自定义组件solt的使用

我们会发现,在自定义模板中有一对<code><slot></slot></code>,这里是干什么用的呢?在组件模板中可以提供一个 <slot> 节点,用于承载...

1742
来自专栏https://www.cnblogs.com/L

C语言的学习

 r  只读  rb只读  r+ rb+(不带b的为已存在的文本文件,带b的为二进制文件(binary),带+号的为读写文件)

782
来自专栏流媒体

tcpdump

tcpdump命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。来自: http:...

882
来自专栏码匠的流水账

nginx rewrite配置解读

本文主要解析一下ngx_http_rewrite_module中的rewrite相关配置。

350
来自专栏IMWeb前端团队

AS3程序员小福利--as3js介绍及FlashDevelop工程的配置

本文作者:IMWeb 黄龙 原文出处:IMWeb社区 未经同意,禁止转载 ? 什么是AS3JS? AS3JS是ActionScript 3.0到Jav...

1986
来自专栏西安-晁州

关于vue.js中slot的理解

slot这块看官网文档,起初有点不懂,仔细研究还是最终理解了,slot是用来干嘛的呢,先看下一个例子:

672
来自专栏海说

vue前端页面跳转参数传递及存储

不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示。 路由传递参数 this.$router.push({ ...

3830

扫码关注云+社区