Swift中遵循protocol的对象是否必须定义delegate变量?
关于Swift中Protocol与Delegate的常见困惑解答
嘿,我来帮你把这两个问题掰扯清楚,其实这是很多刚接触Swift协议的开发者都会绕的弯子~
问题1:遵循Protocol的对象是否必须拥有一个delegate变量才能使用该protocol?
完全不需要!遵循protocol和拥有delegate变量是两个完全独立的概念:
- 遵循protocol的核心意义是:让你的对象具备该协议定义的能力(实现规定的方法或属性),仅此而已。
- delegate是一种设计模式,用来实现对象间的通信,它只是protocol的一种常见用法,但绝不是使用protocol的前提。
举个简单的例子:
// 定义一个协议,要求实现打印方法 protocol Printable { func printSelfInfo() } // 这个类遵循了Printable,但完全没有任何delegate变量 class Book: Printable { let title: String init(title: String) { self.title = title } func printSelfInfo() { print("这本书的名字是:\(title)") } } // 直接使用这个类的能力,根本不需要delegate let myBook = Book(title: "Swift编程入门") myBook.printSelfInfo()
你看,这个Book类完全遵循了协议,也能正常使用协议的能力,从头到尾都没碰过delegate变量。
问题2:遵循某protocol时,是否必须创建同protocol类型的delegate变量?
当然不是!这种误区大多来自UITableView这类UI控件的使用场景,但那只是protocol的一种应用而已。
先澄清UITableView的场景:
你在教程里看到的UITableViewDataSource/UITableViewDelegate,是UITableView这个控件本身需要持有这两个protocol类型的变量,用来向你的ViewController询问数据(比如有多少行单元格)、或者通知ViewController发生了什么事件(比如单元格被点击)。
而你的ViewController作为协议的遵循者,只需要实现协议要求的方法,然后把自己赋值给UITableView的dataSource/delegate属性就行——你的ViewController本身完全不需要创建任何delegate变量!
再看protocol的其他常见用法(完全和delegate无关):
比如Swift标准库的Equatable、Hashable协议,我们让自定义类型遵循这些协议,只是为了让类型支持相等判断、哈希等能力,根本和delegate没关系:
struct Student: Equatable { let studentID: Int let name: String // 遵循Equatable要求实现==方法 static func == (lhs: Student, rhs: Student) -> Bool { return lhs.studentID == rhs.studentID } } let student1 = Student(studentID: 1001, name: "小明") let student2 = Student(studentID: 1001, name: "XiaoMing") print(student1 == student2) // 输出true
还有像自定义的能力协议,比如Payable(可支付)、Shareable(可分享),都是让对象具备对应能力,不需要delegate变量。
最后总结一下核心点:
- 遵循protocol是给对象“解锁能力”,和delegate变量没有强制绑定
- delegate是protocol的一种应用场景,用来解耦对象间的通信,但protocol还有无数其他用途
- UITableView的例子里,是控件需要delegate变量,而不是遵循协议的对象需要创建它
内容的提问来源于stack exchange,提问作者Laurence Wingo
相关产品推荐
相关产品推荐

