当前位置: 首页 > 知识库问答 >
问题:

协议中的Self在子类中是如何解释的?

尉迟韬
2023-03-14

在阅读了一篇关于在协议中使用self的讨论之后,我做了一个实验(参见下面的代码)。我认为代码将无法编译,因为根据我的理解,要使类B符合copyable协议,它应该具有init(_instance:B),这是我没有定义的。但代码实际上起作用了。

我想知道为什么?谢谢你的解释。

 1  import Foundation
   
 2  protocol Copyable: class {
 3      init(_ instance: Self)
 4  }
   
 5  class A: Copyable {
 6      var x: Int
 7      
 8      init(x: Int) {
 9          self.x = x
10      }
11      
12      required init(_ instance: A) {
13          self.x = instance.x
14      }
15  }
   
16  class B: A {
17      var y: Int
18      
19      init(x: Int, y: Int) {
20          self.y = y
21          super.init(x: x)
22      }
23      
24      required init(_ instance: A) {
25          self.y = 1
26          super.init(instance)
27      }
28  }
   
29  var a = A(x:1)
30  var b = B(a)

共有1个答案

尚俊楠
2023-03-14

根据文档,在这种情况下Self将是A,因为A是符合协议的,所以B只是间接地作为A的子类来做它。

因此,当A符合copyable时,您是说A及其所有子类必须有一个init(_instance:A)

在协议声明或协议成员声明中,Self类型是指符合协议的最终类型。

实际上,您可以通过删除必需的init(_instance:A)init,并且即使您有init(_instance:B)也会得到一个错误,因此,由于A是符合协议的类,您必须有一个init,其中instance参数是A

 类似资料:
  • 问题内容: 除了带有协议扩展的语法外: …我偶然发现您可以在协议本身上使用相同的where子句: 请注意,这是 不 一样的where子句限制一个通用的协议,并 没有 自己做P上的通用协议。 我的实验似乎表明,此处只能使用冒号,并且冒号后面的内容必须是类或协议(可能是通用的)。 我很好奇:这是怎么逃避我的注意的?所以我去寻找它何时出现的证据。在Swift 3.0中,前一种语法是合法的,但后者 则不

  • 问题内容: 如何列出在Swift中实现给定协议的所有类? 说我们有一个例子: 这是我当前的(不可编译)方法: 但是当打电话给 要么 要么 导致Xcode错误:无法将类型(Animal.Protocol).Type的值转换为预期的参数类型’Protocol’。 有人设法使这个工作正常吗? 问题答案: 由于您使用的是Objective-C运行时来获取类型自省,因此需要以这种方式添加到代码中: 请注意,

  • 问题内容: 在Objective-C中: 在Swift中: 但是,将出现一条错误消息: 类型“ CellDatasDataSource”不符合协议“ NSObjectProtocol” 类型“ CellDatasDataSource”不符合协议“ UITableViewDataSource” 正确的方法应该是什么? 问题答案: 类型“ CellDatasDataSource”不符合协议“ NSOb

  • 问题内容: 在下面的代码中,我想测试是否为。如果是的话,我想作为。你怎么做到这一点?如果不使用强制转换,则使用其他技术。 那里的最后一行不会编译。错误是: 协议“ SpecialController”仅具有通用要求或关联类型要求,因此只能用作通用约束。 问题答案: 不幸的是,Swift当前不支持将具有关联类型的协议用作实际类型。但是,从技术上讲这对于编译器是可行的。并且很可能在该语言的未来版本中实

  • 本文向大家介绍javaweb中Http协议详解,包括了javaweb中Http协议详解的使用技巧和注意事项,需要的朋友参考一下 一、什么是HTTP协议   HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资

  • 问题内容: 我有一个协议,该协议继承自另一个协议,并且满足扩展要求。 还有另一种协议,其要求()应该为。 现在,如果我尝试使用as ,那么它将无法编译。它说, 推断的类型“地址”(通过匹配要求“ valueForDetail”)无效:不符合“ Validator”。 这种用法非法吗?我们不能像所有的那样用它代替。 下面是我正在尝试的代码。 更新: 提交了一个错误。 问题答案: David已经提到的