`:class`究竟在协议声明中做了什么?

nbu*_*urk 3 objective-c ios swift

SO后解释得很好如何解决创建一个问题delegateweak.

基本上,有两种方法:

使用@objc关键字:

@objc protocol MyClassDelegate {
}

class MyClass {
  weak var delegate: MyClassDelegate?
}
Run Code Online (Sandbox Code Playgroud)

使用:class关键字:

protocol MyClassDelegate: class {
}

class MyClass {
  weak var delegate: MyClassDelegate?
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试做一些研究,以了解这两种方法之间的差异究竟是什么.该文档是关于使用非常清楚@objc:

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

但是,我找不到有关:class实际行为的信息.从细节上考虑整个概念,它实际上并没有多大意义.我的理解是,classSwift中的关键字是声明类.所以,这里似乎我们正在使用关键字class本身作为协议(因为我们在:协议声明之后附加它).

那么,为什么这甚至在语法上有效,它究竟是做什么的呢?

NRi*_*itH 5

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