ios - `: class` 在协议(protocol)声明中究竟做了什么?

标签 ios objective-c swift

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

基本上,有两种方法:

使用@objc关键字:

@objc protocol MyClassDelegate {
}

class MyClass {
  weak var delegate: MyClassDelegate?
}

使用 :class 关键字:

protocol MyClassDelegate: class {
}

class MyClass {
  weak var delegate: MyClassDelegate?
}

我正在尝试进行一些研究,以了解这两种方法之间的确切区别。 docs非常清楚如何使用 @objc:

To be accessible and usable in Objective-C, a Swift class must be a descendant of an Objective-C class or it must be marked @objc.

但是,我在任何地方都找不到有关 :class 实际作用的信息。详细考虑整个概念,实际上并没有多大意义。我的理解是 class 是 Swift 中声明类的关键字。所以,这里似乎我们使用关键字 class 本身作为协议(protocol)(因为我们将它附加在 : 协议(protocol)声明之后)。

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

最佳答案

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

关于ios - `: class` 在协议(protocol)声明中究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096030/

相关文章:

ios - 以编程方式添加的约束不起作用

ios - 在 iOS MapView 中更改 map 颜色?

iphone - 从设置包中检索切换开关值

ios - 正确使用 sendSubview(toBack : ) function in swift

当应用程序从非事件状态变为非事件状态时调用的 iOS Controller 方法

ios - 为标识符(单元格)注册的无效 Nib

objective-c - 从另一个类实现中获取 CGFloat 实例变量

ios - 快速使用collectionview滑动图像

swift - 不正确的字符串到日期转换 swift 3.0

ios - Avplayer ios 10* 的屏幕截图图像是黑色图像