原文:Swift delegate design pattern - The.Swift.Dev.
💡 委托设计模式是一种相对简单的方式,可以通过 Swift 中的公共接口协议在两个对象之间进行通信。
在 Swift 中实现委托
您将需要一个委托协议、一个实际委托任务的委托人和一个实现委托协议并执行 “老板” 要求的实际工作的委托对象。让我们把它翻译成人话。
💡 客户报告了一个错误。项目经理创建一个问题并告诉其中一位开发人员尽快解决问题。
看?这就是委托。在某个时刻发生了事件,因此委托人(经理)利用外部资源(开发人员)使用公共接口(为双方描述问题的 issue)来实现某些目标(修复🐛)。
为了演示委托在现实生活中是如何工作的,我做了一个非常简单的例子。我将使用类似的方法(因为 Xcode playground 仍然每 1-5 分钟冻结一次)就像我对命令模式所做的那样,但这个方法的目的几乎完全不同,因为我们正在谈论 delegation。 🤗
import Foundation
protocol InputDelegate {
var shouldContinueListening: Bool { get }
func didStartListening()
func didReceive(input: String)
}
class InputHandler {
var delegate: InputDelegate?
func listen() {
self.delegate?.didStartListening()
repeat {
guard let input = readLine() else {
continue
}
self.delegate?.didReceive(input: input)
}
while self.delegate?.shouldContinueListening ?? false
}
}
struct InputReceiver: InputDelegate {
var shouldContinueListening: Bool {
return true
}
func didStartListening() {
print("👻 Please be nice and say \"hi\", if you want to leave just tell me \"bye\":")
}
func didReceive(input: String) {
switch input {
case "hi":
print("🌎 Hello world!")
case "bye":
print("👋 Bye!")
exit(0)
default:
print("🔍 Command not found! Please try again:")
}
}
}
let inputHandler = InputHandler()
let inputReceiver = InputReceiver()
inputHandler.delegate = inputReceiver
inputHandler.listen()
这就是您如何在 Swift 中创建自己的委托模式。您可以想象 Apple 在幕后做同样的事情,使用 UICollectionViewDataSource、UICollectionViewDelegate 等。您只需实现委托,他们将提供协议和委托者。 🤔
弱属性、委托和类
内存管理是一件非常重要的事情,所以值得一提的是所有类委托都应该是弱属性,否则你会创建一个非常糟糕的引用循环。 😱
protocol InputDelegate: class { /*...*/ }
class InputHandler {
weak var delegate: InputDelegate?
/*...*/
}
class InputReceiver: InputDelegate {
/*...*/
}
这是修改后的 Swift 代码片段,但现在使用一个类作为委托。你只需要稍微改变你的协议和委托人的财产。如果要将类指定为委托,请始终使用弱委托变量。 ⚠️
如您所见,委派非常简单,但也可能很危险。它通过提供一个公共接口来帮助解耦,任何实现委托(有时是数据源)协议的人都可以使用该接口。关于委托的文章真的很棒,如果您想了解更多关于这种模式的信息,您应该查看它们。
谢谢。 🙏