更多内容,欢迎关注公众号:Swift花园
喜欢文章?不如来点赞关注吧
委托代理设计模式一种相对易用的两个对象间通信的方式。
实现 Swift 中的委托代理
委托协议:一个委托者将任务委派出去,一个代理对象实现委托协议,完成”老板“交待的工作。让我们翻译成人话。
客户反馈Bug,项目经理创建 issue,告知开发尽快修复Bug。
这就是委托代理。当某个节点事件发生时,委托者利用通用接口(描述问题的 issue),指定外部资源(这里的开发)完成某事。 (修复 🐛)。
举个代码示例吧。
#!/usr/bin/env swift
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("👻 \"hi\", 离开时请说 \"bye\":")
}
func didReceive(input: String) {
switch input {
case "hi":
print("🌎 Hello world!")
case "bye":
print("👋 Bye!")
exit(0)
default:
print("🔍 找不到命令,请重试:")
}
}
}
let inputHandler = InputHandler()
let inputReceiver = InputReceiver()
inputHandler.delegate = inputReceiver
inputHandler.listen()想象一下,Apple 在底层其实做着一样的事情,比如 UICollectionViewDataSource, UICollectionViewDelegate 等等。你只需要实现代理,而它们提供协议和委托者。🤔
Weak属性,委托和类
内存管理是一件很重要的事,因为值得一提的是:类的所有代理对象都应该是 weak 属性,否则你可能会陷入糟糕的引用循环。😱
protocol InputDelegate: class { /*...*/ }
class InputHandler {
weak var delegate: InputDelegate?
/*...*/
}
class InputReceiver: InputDelegate {
/*...*/
}如你所见,委托代理其实很简单,但使用时也要注意规避风险。通过提供可以由任何人实现的普通接口,它帮助解耦代码。关于委托代理的文章其实很多,这里就不再赘述了。
我的公众号
这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~