swift - 委托(delegate)与类引用

标签 swift delegates protocols

如果我在 A 类中并且我想在 B 类中运行一个函数,我可以通过多种方式来实现。在我的应用程序中,我使用了两种不同的方式,它们的行为也不同,但我不确定为什么。

第一种是通过委托(delegate)。我设置了一个协议(protocol),在 prepareForSegue 中设置委托(delegate),然后使用它从类 B 回调到类 A:

var delegateToParentVC: mainViewDelegate!
delegateToParentVC.sendAsMsg(txtTask.text!, descPassed: txtDesc.text)

我的第二种方法是,在类中我将类 A 分配给一个变量。然后我可以用它来引用类 A 中的函数。

let allocVC = AllocationViewController()
allocVC.sendAsMsg(txtTask.text!, descPassed: txtDesc.text)

第二种方法似乎更容易设置(没有协议(protocol),没有 prepareForSegue 代码)。但是,它会更频繁地引起故障,我不明白为什么。

例如,每当我使用第二种方法在 A 中运行一个函数时,它的代码会关闭 B,这似乎会造成麻烦。据我所知,只要我需要特定的操作顺序,除非使用委托(delegate),否则我会遇到麻烦。

我发帖不是为了解决问题。我真的需要有人来解释它们为何不同,并举例说明何时使用它们。

最佳答案

您似乎不了解类和实例(面向对象编程)。一个类可以有多个实例;这些实例彼此不是同一对象。您不向 View Controller 发送消息,而是向 View Controller 实例发送消息。在您的场景中,一个 View Controller 实例正在尝试将消息发送回另一个已经存在的 View Controller 实例

因此,这种方法根本行不通:

let allocVC = AllocationViewController()
allocVC.sendAsMsg(txtTask.text!, descPassed: txtDesc.text)

在这种方法中,您将创建一个全新 AllocationViewController 实例并向其发送消息。但这毫无意义,因为这个 AllocationViewController 实例不是现有的 AllocationViewController 实例。这是您要向其发送消息的现有 AllocationViewController 实例。

这就是第一个方法确实有效的原因。您正在将 delegateToParentVC 设置为 实际的、现有的 AllocationViewController 实例。

关于swift - 委托(delegate)与类引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34780196/

相关文章:

c++ - 如何解码跟踪器响应中的对等值 (Bittorrent)

protocols - 如何在MQTT中实现一对一通信?

soap - CWMP CPE(客户端)实现

swift - 将 TPK 文件从 AppGroup 容器复制到文档

swift - 计时器 onReceive 在 NavigationView 中不起作用

ios - GoogleWebRTC 音频视频通话 iOS

java - Java 与 .NET Func<> 和 Action<> 委托(delegate)最接近的是什么?

c# - 在 C# 中将 EventHandler 类型 var 等同于委托(delegate)意味着什么?

ios - Swift:UIPopoverPresentationControllerDelegate 委托(delegate)变为 nil

ios - 将结构保存到 UserDefaults