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 条评论
登录 后参与评论

相关文章

来自专栏上善若水

005-golang-单元测试

Go语言中自带有一个轻量级的测试框架testing和自带的 go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,你可以基于...

15840
来自专栏编程

Python基础知识4:文件操作

文件的知识:打开文件、操作文件、关闭文件 1、关于打开文件: f.open('text','r')#r代表只读 f.open('text','w')#w代表只写...

22560
来自专栏烂笔头

Python标准库笔记(5) — sched模块

目录[-] 事件调度 sched模块内容很简单,只定义了一个类。它用来最为一个通用的事件调度模块。 class sched.scheduler(timefu...

37150
来自专栏数据结构与算法

2991:2011

2991:2011 查看 提交 统计 提问 总时间限制:1000ms内存限制:65536kB描述已知长度最大为200位的正整数n,请求出2011^n的后四位。输...

34770
来自专栏林冠宏的技术文章

Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

Golang 简称 Go,Go 的协程(goroutine) 和我们常见的线程(Thread)一样,拥有其调度器。

47710
来自专栏烂笔头

Python判断文件是否存在的三种方法

目录[-] 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错。所以最好在做任何操作之前,先判断文件是否存在。 这里将介绍三种...

52680
来自专栏程序员同行者

python3模块: sys

18230
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

12430
来自专栏令仔很忙

Hibernate从入门到放弃(三)----持久化对象

当对象刚创建,和Session没有发生任何关系时,当程序运行完成就立刻消失,被称为瞬时态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失...

13810
来自专栏武军超python专栏

2018年8月25日多进程编程总结

今天遇到的新单词: terminal    n终端 terminate  v结束,使终结 basic        adj基本的

15050

扫码关注云+社区

领取腾讯云代金券