Swift 委托设计模式

295 阅读2分钟

原文: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 在幕后做同样的事情,使用 UICollectionViewDataSourceUICollectionViewDelegate 等。您只需实现委托,他们将提供协议和委托者。 🤔

弱属性、委托和类

内存管理是一件非常重要的事情,所以值得一提的是所有类委托都应该是弱属性,否则你会创建一个非常糟糕的引用循环。 😱

protocol InputDelegate: class { /*...*/ }

class InputHandler {

    weak var delegate: InputDelegate?

    /*...*/
}

class InputReceiver: InputDelegate {
    /*...*/
}

这是修改后的 Swift 代码片段,但现在使用一个类作为委托。你只需要稍微改变你的协议和委托人的财产。如果要将类指定为委托,请始终使用弱委托变量。 ⚠️

如您所见,委派非常简单,但也可能很危险。它通过提供一个公共接口来帮助解耦,任何实现委托(有时是数据源)协议的人都可以使用该接口。关于委托的文章真的很棒,如果您想了解更多关于这种模式的信息,您应该查看它们。

谢谢。 🙏