我在目标C协议中声明了一种方法:
@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 {}
?
发布于 2016-03-04 05:43:05
这里有两个问题,因此我将尽可能直接地解决这两个问题。
在类体中直接使用
chatServiceChatDidConnect
方法或将其作为扩展的一部分添加有什么区别?
根据你所说的“差异”的意思,答案要么是“没有”,要么是“很少”。
一旦您的项目被编译,就没有什么不同了。在编译过程中,可能需要稍长的时间,但我怀疑这种差异是否足以引起人们的注意。在开发过程中,差异主要是组织性的,但可能部分是架构性的。
如果不将扩展名移动到单独的文件中,则区别将是纯组织性的。如果您的类符合多个协议或特别大的协议,那么将协议一致性组织到扩展中对于类的人工解析可能是有益的。
如果确实将扩展名移到单独的文件中,那么当我们考虑private
访问修饰符在Swift中如何工作时(或者当我们认为扩展名可能不仅仅是不同的文件,而是不同的模块,但为了简单起见,让我们关注private
)时,您也可以获得一些架构上的差异。
考虑遵从UITableViewDataSource
协议。可以想象,在从tableView(_:cellForRowAtIndexPath:)
返回一个单元时,我们可能需要一些助手方法,如果是这样的话,tableView(_:cellForRowAtIndexPath:)
可能是真正需要调用这些方法的唯一方法。如果是这样的话,我们可以在一个单独文件中的扩展名中创建协议一致性,并将所有的辅助方法标记为private
。现在,我们已经将这些助手方法的范围缩小到了这个扩展(扩展应该是唯一需要它的地方)。
我需要声明为
extension Chat: QMChatConnectionDelegate {}
还是extension Chat {}
?
答案是看情况而定。
当然,您不需要在多个地方将您的类标记为符合协议。只要一个就行了。虽然扩展可以具有与它们扩展的类不同的访问级别(例如,一个private
类的internal
扩展),但是它们的访问级别不能比它们扩展的类更宽(例如,不允许internal
类的public
扩展)。
对我来说,最有意义的不是将类标记为符合协议,而是将扩展标记为符合协议:
class Chat: NSObject {}
extension Chat: QMChatConnectionDelegate {}
重要的是,当我们创建这样的类和扩展时,它使我们的代码保持相当模块化。我们班不应该依赖扩展中的任何东西。它应该完全不使用它,并且删除扩展允许我们的类仍然正常工作(只是不适合使用QMChatConnection)。
发布于 2016-03-04 05:10:31
首先,扩展名声明仅对文件作用域有效,因此第二个示例应该如下所示:
class Chat: NSObject
{
...
}
extension Chat : QMChatConnectionDelegate {
func chatServiceChatDidConnect(chatService: QMChatService!) {
print("connected")
}
其次,您不应该在类声明和扩展中重新声明协议一致性。
您应该或多或少地将Swift扩展处理为目标-C中的类别。
在回答您的问题时,如果您在类范围或扩展中直接声明符合协议的方法,则没有太大的区别。在扩展中添加协议一致性可能有以下几个好处:
https://stackoverflow.com/questions/35795138
复制相似问题