gpt4 book ai didi

objective-c - 快速调用 Objective - C 委托(delegate)方法

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:56 25 4
gpt4 key购买 nike

我有一个在 Objective-C 协议(protocol)中声明的方法:

@protocol QMChatConnectionDelegate <NSObject>
@optional
- (void)chatServiceChatDidConnect:(QMChatService *)chatService;

我想在我的 .swift 文件中使用这个方法作为回调。我的问题是直接在类主体中使用 chatServiceChatDidConnect 方法或将其添加为扩展的一部分有什么区别:

class Chat: NSObject, QMChatConnectionDelegate
{
...
func chatServiceChatDidConnect(chatService: QMChatService!) {
print("connected")
}
}

class Chat: NSObject, QMChatConnectionDelegate
{
...
}

extension Chat: QMChatConnectionDelegate {
func chatServiceChatDidConnect(chatService: QMChatService!) {
print("connected")
}
}

我是否需要将其声明为 extension Chat : QMChatConnectionDelegate {} 或只是 extension Chat {}

最佳答案

这里有两个问题,所以我会尽可能直接地回答这两个问题。


What is difference between using chatServiceChatDidConnect method directly in class body or adding it as part of extension?

根据您所说的“差异”是什么意思,答案是“没有”或“非常小”。

一旦您的项目被编译,将没有区别。在编译过程中,可能 需要稍长的时间,但我怀疑这种差异是否足够明显以引起注意。在开发过程中,差异主要是组织上的,但可能部分是架构上的。

如果您不将扩展名移到单独的文件中,区别将纯粹是组织上的。如果您有一个类符合多个协议(protocol)或特别大的协议(protocol),那么在涉及类的人工解析时,将协议(protocol)一致性组织到扩展中可能是有益的。

如果你确实将扩展移动到一个单独的文件中,当我们考虑 private 访问修饰符在 Swift 中的工作方式(或者默认的 internal 当我们认为扩展名可能不仅仅是一个不同的文件,而是一个不同的模块时,但为了简单起见,让我们关注 private)。

考虑遵守 UITableViewDataSource 协议(protocol)。可以想象,当涉及到从 tableView(_:cellForRowAtIndexPath:) 返回单元格时,我们可能需要一些辅助方法,如果是这样的话,tableView(_:cellForRowAtIndexPath:) 可能是实际需要调用这些方法的唯一方法。如果是这种情况,我们可以在单独文件的扩展中创建协议(protocol)一致性,并将所有辅助方法标记为 private。现在我们已经将这些辅助方法的范围缩小到只有那个扩展(这应该是唯一需要它的地方)。


Do I need to declare it as extension Chat: QMChatConnectionDelegate {} or just extension Chat {}?

这个问题的答案视情况而定

当然,您不需要在多个地方将您的类标记为符合协议(protocol)。一个就可以了。虽然扩展可以具有与其扩展的类不同的访问级别(例如 internal 类的 private 扩展),但它们的访问级别不能比类更宽它们扩展(例如,不允许 internal 类的 public 扩展)。

对我来说最有意义的是将类标记为符合协议(protocol)但将扩展标记为符合协议(protocol):

class Chat: NSObject {}
extension Chat: QMChatConnectionDelegate {}

重要的是,当我们像这样创建我们的类和扩展时,它使我们的代码非常模块化。我们的类(class)不应该依赖扩展中的任何东西。它应该在没有它的情况下完全运行,并且删除扩展允许我们的类仍然正常工作(只是不是为了使用 QMChatConnection)。

关于objective-c - 快速调用 Objective - C 委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35795138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com