在协议声明中,`:class`是做什么的?

这个SOpost很好地解释了如何解决创buildweak delegate的问题。

本质上有两种方法:

使用@objc关键字:

 @objc protocol MyClassDelegate { } class MyClass { weak var delegate: MyClassDelegate? } 

使用:class关键字:

 protocol MyClassDelegate: class { } class MyClass { weak var delegate: MyClassDelegate? } 

我试图做一些研究,以了解这两种方法之间究竟有什么区别。 这个文档很清楚使用@objc

要在Objective-C中可访问和使用,Swift类必须是Objective-C类的后代,或者必须标记为@objc

然而,我没有find一些关于什么的信息:class实际上是这样做的。 仔细考虑整个概念,实际上并没有什么意义。 我的理解是, class是Swift中的一个关键字来声明类。 所以,在这里,我们似乎将关键字class本身用作协议(正如我们在协议声明之后追加它)。

那么,为什么这个语法甚至在语法上起作用呢?它究竟做了什么?

:class确保只有类可以实现协议。 这是任何类,不只是NSObject子类。 另一方面, @objc告诉编译器使用Objective-C风格的消息传递来调用方法,而不是使用vtable来查找函数。