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

时间:2016-10-17 21:33:22

标签: ios objective-c swift

SO post很好地解释了如何解决创建delegate weak的问题。

基本上,有两种方法:

使用@objc关键字:

@objc protocol MyClassDelegate {
}

class MyClass {
  weak var delegate: MyClassDelegate?
}

使用:class关键字:

protocol MyClassDelegate: class {
}

class MyClass {
  weak var delegate: MyClassDelegate?
}

我正在尝试进行一些研究,以了解这两种方法之间的差异究竟是什么。 docs非常清楚使用@objc

  

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

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

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

1 个答案:

答案 0 :(得分:5)

>>> (bool_sliced_idx1==True).index Int64Index([0, 1, 5, 8], dtype='int64') 确保只有类可以实现协议。这就是任何类,而不仅仅是:class的子类。另一方面,NSObject告诉编译器使用Objective-C样式的消息传递来调用方法,而不是使用vtable来查找函数。