gpt4 book ai didi

objective-c - 如果不进行检查,那么制定协议(protocol)还有什么意义呢?

转载 作者:行者123 更新时间:2023-12-03 16:31:26 26 4
gpt4 key购买 nike

我正在阅读有关 Cocoa 和 Objective C 的书(“Aaron Hillegass, Adam Preble - Cocoa Programming for Mac OS X - 2012”),当我使用 NSTableView 做这个示例时,我注意到它确实没有如果我将我的类(class)定义为符合 NSTableViewDataSource, NSTableViewDelegate 也没关系协议(protocol)或省略它们,只有方法才重要。 (看起来有点像鸭子打字)

也就是说,应用程序可以在这两种定义下正常工作:

@interface SpeakLineAppDelegate : NSObject <NSApplicationDelegate, NSSpeechSynthesizerDelegate, NSTableViewDataSource, NSTableViewDelegate>

@interface SpeakLineAppDelegate : NSObject <NSApplicationDelegate, NSSpeechSynthesizerDelegate>

如果我没有实现 NSTableViewDataSource 中定义的 2 个基本方法,它只会在运行时对我大喊大叫。 ,无论如何,我是否将这些协议(protocol)放在类定义中根本不重要。那么,将它们放入语言中有何意义呢?如果它们仅用于文档,我们也可以将它们的名字放在注释中,对吗?或者我在这里遗漏了一些重要的东西?

最佳答案

可以在编译时和运行时检查协议(protocol)一致性。就像大多数人在评论中所说的那样,协议(protocol)一致性是在编译时检查的。如果您将不符合协议(protocol)的类型(id 除外)分配给用该协议(protocol)括起来的类型变量,则编译器应该向您发出警告。因此,为了能够将不符合协议(protocol)的对象传递给该参数类型的参数,您必须 1) 忽略警告,或 2) 通过类型 id ,这会关闭静态类型检查。

您调用的 API 还可以(如果需要的话)使用 conformsToProtocol: 在运行时检查您的对象是否正式符合协议(protocol)。然而,Cocoa 中的惯例是,API 从不检查协议(protocol)的形式一致性,而只是在需要调用时检查它是否响应给定的选择器。这为用户提供了更大的灵 active ,例如,可以使用类对象(元类不能正式符合协议(protocol),除了根类符合的协议(protocol)之外)作为委托(delegate)。

关于objective-c - 如果不进行检查,那么制定协议(protocol)还有什么意义呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24638960/

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