Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如果没有检查协议,那么制定协议的意义何在?_Objective C_Macos_Cocoa_Protocols_Nstableview - Fatal编程技术网

Objective c 如果没有检查协议,那么制定协议的意义何在?

Objective c 如果没有检查协议,那么制定协议的意义何在?,objective-c,macos,cocoa,protocols,nstableview,Objective C,Macos,Cocoa,Protocols,Nstableview,我正在阅读有关Cocoa和Objective C的书(“Aaron Hillegass,Adam Preble-MacOS X-2012的Cocoa编程”),当我使用NtableView进行示例时,我注意到,如果我将类定义为符合NtableViewDataSource,NtableViewDelegate协议或忽略它们,其实并不重要,只有方法才重要。(看起来有点像鸭子打字) 也就是说,应用程序在两种定义下都可以正常工作: @接口SpeakLineAppDelegate:NSObject 和 @接

我正在阅读有关Cocoa和Objective C的书(“Aaron Hillegass,Adam Preble-MacOS X-2012的Cocoa编程”),当我使用NtableView进行示例时,我注意到,如果我将类定义为符合
NtableViewDataSource,NtableViewDelegate
协议或忽略它们,其实并不重要,只有方法才重要。(看起来有点像鸭子打字)

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

@接口SpeakLineAppDelegate:NSObject


@接口SpeakLineAppDelegate:NSObject


只有在运行时,如果我没有实现在
NSTableViewDataSource
中定义的两个基本方法,它才会对我大喊大叫,而且在任何情况下,我是否将这些协议放在类定义中都无关紧要。那么,在语言中使用它们有什么意义呢?如果它们只是为了文档,我们也可以把它们的名字放在评论中,对吗?或者我遗漏了一些重要的内容?

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


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

如果方法是
@必需的
,则应在编译时发出警告。@jtbandes但如果协议只有可选方法,没用吗?objective-c是一种受惯例驱动的语言,你可以做很多你不应该做的事情,但是维护您的代码的人不会对您感到满意。您是否在xib或代码中连接数据源和委托?如果您试图将委托或数据源设置为不声明一致性的对象,您将有不匹配的类型,并且应该得到编译器警告
id
不等于
id