首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用Objective C委托方法

调用Objective C委托方法
EN

Stack Overflow用户
提问于 2016-03-04 11:40:31
回答 2查看 1K关注 0票数 1

我在目标C协议中声明了一种方法:

代码语言:javascript
运行
复制
@protocol QMChatConnectionDelegate <NSObject>
@optional
- (void)chatServiceChatDidConnect:(QMChatService *)chatService;

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

代码语言:javascript
运行
复制
class Chat: NSObject, QMChatConnectionDelegate
{
...
  func chatServiceChatDidConnect(chatService: QMChatService!) {
    print("connected")
  }
}

代码语言:javascript
运行
复制
class Chat: NSObject, QMChatConnectionDelegate
{
...
}

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

我需要把它声明为extension Chat : QMChatConnectionDelegate {}还是extension Chat {}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-04 13:43:05

这里有两个问题,因此我将尽可能直接地解决这两个问题。

在类体中直接使用chatServiceChatDidConnect方法或将其作为扩展的一部分添加有什么区别?

根据你所说的“差异”的意思,答案要么是“没有”,要么是“很少”。

一旦您的项目被编译,就没有什么不同了。在编译过程中,可能需要稍长的时间,但我怀疑这种差异是否足以引起人们的注意。在开发过程中,差异主要是组织性的,但可能部分是架构性的。

如果不将扩展名移动到单独的文件中,则区别将是纯组织性的。如果您的类符合多个协议或特别大的协议,那么将协议一致性组织到扩展中对于类的人工解析可能是有益的。

如果确实将扩展名移到单独的文件中,那么当我们考虑private访问修饰符在Swift中如何工作时(或者当我们认为扩展名可能不仅仅是不同的文件,而是不同的模块,但为了简单起见,让我们关注private)时,您也可以获得一些架构上的差异。

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

我需要声明为extension Chat: QMChatConnectionDelegate {}还是extension Chat {}

答案是看情况而定。

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

对我来说,最有意义的不是将类标记为符合协议,而是将扩展标记为符合协议:

代码语言:javascript
运行
复制
class Chat: NSObject {}
extension Chat: QMChatConnectionDelegate {}

重要的是,当我们创建这样的类和扩展时,它使我们的代码保持相当模块化。我们班不应该依赖扩展中的任何东西。它应该完全不使用它,并且删除扩展允许我们的类仍然正常工作(只是不适合使用QMChatConnection)。

票数 2
EN

Stack Overflow用户

发布于 2016-03-04 13:10:31

首先,扩展名声明仅对文件作用域有效,因此第二个示例应该如下所示:

代码语言:javascript
运行
复制
class Chat: NSObject
{
...
}

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

其次,您不应该在类声明和扩展中重新声明协议一致性。

您应该或多或少地将Swift扩展处理为目标-C中的类别。

在回答您的问题时,如果您在类范围或扩展中直接声明符合协议的方法,则没有太大的区别。在扩展中添加协议一致性可能有以下几个好处:

  1. 可以在单独的文件中添加实现某些协议的方法。
  2. 您可以在现有类中添加协议一致性,而无需修改它们的主体。因此,最终您可以将协议一致性添加到第三方类中。
  3. 它允许您的源代码有一个良好的逻辑组织。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35795138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档