我正在阅读关于Cocoa和Objective C的书(" Aaron Hillegass,Adam Preble - 适用于Mac OS X的可可编程 - 2012")当我用NSTableView做的例子时,我我注意到,如果我将我的类定义为符合NSTableViewDataSource, NSTableViewDelegate
协议或省略它们,那么事情并不重要,只有方法很重要。 (看起来像是 duck typing )
也就是说,应用程序可以正常使用这两个定义:
@interface SpeakLineAppDelegate : NSObject <NSApplicationDelegate, NSSpeechSynthesizerDelegate, NSTableViewDataSource, NSTableViewDelegate>
和
@interface SpeakLineAppDelegate : NSObject <NSApplicationDelegate, NSSpeechSynthesizerDelegate>
如果我没有实现NSTableViewDataSource
中定义的两种基本方法,它只会在运行时向我大喊,无论如何它并不重要所有如果我把这些协议放在类定义中。那么,在语言中使用它们有什么意义呢?如果它们仅用于文档,我们也可以将它们的名字放在评论中,对吗?或者我在这里遗漏了一些重要的东西?
答案 0 :(得分:3)
可以在编译时和运行时检查协议一致性。像大多数人在评论中所说的那样,在编译时检查协议一致性。如果将不符合协议的类型(除id
除外)分配给使用该协议括起来的类型的变量,编译器应该给出警告。因此,为了能够将不符合协议的对象传递给该参数类型的参数,您必须要么1)忽略警告,要么2)经历类型id
,关闭静态类型检查。
您调用的API 可以(如果需要)使用conformsToProtocol:
在运行时检查您的对象是否正式符合协议。但是,Cocoa中的约定是API从不检查协议的正式一致性,而只是在需要调用时检查它是否响应给定的选择器。这为用户提供了更大的灵活性,例如,使用类对象(元类不能正式符合协议,除了符合根类的协议)作为委托。