当前位置: 首页 > 面试题库 >

`:class`在协议声明中到底做了什么?

巫晋鹏
2023-03-14
问题内容

解释了如何解决创建delegateis 的问题weak

本质上,有两种方法:

使用@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

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

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


问题答案:

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



 类似资料:
  • 问题内容: 连接到MySQL数据库时,请执行以下步骤 实际上,我想知道语句的作用。 虽然此类不在mysql.jar中。它在哪里? 问题答案: 本类位于java.lang包,因此在分布用java,并自动导入到每个班级。 该方法所做的只是返回由类加载器加载的参数对象。然后,该方法返回该类的新实例。 因此,发生什么情况是您称之为 返回com.mysql.jdbc.Driver.class。然后,您调用该

  • 首先,我知道这个问题,但我对其中没有提供的细节感兴趣。 我看了一下m2eclipse的留档,发现它不令人满意地简洁。我能找到的唯一相关的部分是 或者,您可以从项目弹出菜单中运行“Maven/Update project configuration”操作,该菜单默认配置为运行“process resources”,也可以在相同的首选项页面上更改。 但我无法确定是否与相同。我在浏览时发现的所有其他来源

  • 问题内容: 有客观定义吗?它是作为python源代码的一部分实现的吗?如果是这样,有人可以产生确切的代码行吗?是否所有语言都有自己的“ for”语句迭代器协议? 问题答案: 它位于这里的文档: 需要为容器对象定义一种方法以提供迭代支持: 返回一个迭代器对象。需要该对象支持以下所述的迭代器协议。如果容器支持不同类型的迭代,则可以提供其他方法来专门请求那些迭代类型的迭代器。(支持多种形式的迭代的对象的

  • 问题内容: 我正在看自动布局库中的一些代码。其中,UIView采用了一个协议: 一个空虚的成就是什么? 问题答案: 这些是采用协议的类必须为其提供吸气剂的属性。该协议未指定有关setter的任何内容,因此类可以提供计算的属性,而不是存储的属性。 例如,采用的类可以通过添加来满足具有的要求 或通过添加

  • 问题内容: 当我使用Express二进制文件创建示例Express应用程序时,引导代码包含以下几行: 我对app.router的了解不多。我以为这是处理路由(app.get(),app.post()等)规则的中间件,但是当我删除app.use(app.router)时,这些规则也会执行。线。 那么,该中间件的确切用途是什么? 问题答案: 这来自Express 2.x指南http://express

  • 问题内容: 在Tour of Go网站的go 1.5发行之前的版本中,有一段代码看起来像这样。 输出看起来像这样: 令我困扰的是,将其删除后,该程序不再显示“世界”。 为什么呢?如何影响执行力? 问题答案: 注意: 从Go 1.5开始,将GOMAXPROCS设置为硬件内核数:golang.org/doc/go1.5#runtime,低于1.5之前的原始答案。 当您在未指定GOMAXPROCS环境变