环境:
XCode:版本8.3.3(8E3004b)
此处提到的Apple文档来自XCode本身,而不是在线文档
描述:
从Apple文档中, UITalbeViewController 类与其他类的关系如下图所示。它继承自1个类并符合7个协议(你会发现它符合来自online documents的8个协议[2017年6月18日访问]。
当我通过命令打开XCode头文件时,单击 UITalbeVIewController 字符串,我得到以下结果(请参见下图)。它只显示了2个协议(UITalbeViewDelegate和UIBalbeVIewDataSource)
问题:
为什么头文件没有显示 UITableViewController 符合的其他5个协议?
感谢您的时间和帮助
答案 0 :(得分:3)
取决于协议,有不同的原因。
扩展中采用了某些协议,因此不会出现在类定义中。以UIStateRestoring
和NSExtensionRequestHandling
协议为例。您会在UIViewController
的标题中找到UIViewController
在扩展名中采用它们(因此继承也被UITableViewController
采用)。
在Swift中导入Objective-C类时,有些编译器会自动生成它们。因此,您不会在标头中看到它们的采用,因为标头只是在Swift中重写的Objective-C标头。 Equatable
和Hashable
就属于这种情况。在Objective-C中,所有继承自NSObject
的类都具有isEqual(_:)
方法和hash
属性,因此在Swift中自动采用Equatable
和Hashable
协议(但协议并不存在于Objective-C中。
编译器使用一些标记来实现Swift和C或Objective-C之间的桥接。这是CVarArg
协议的情况。你可以看到这个协议是空的,所以可以被任何类或结构所采用,但它曾经让编译器知道采用它的类可以安全地用于一些非常具体的C API。