You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:32:37