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

问题描述

在阅读了关于在协议中使用 Selfdiscussion 后,我做了一个实验(见下面的代码)。我认为代码将无法编译,因为根据我的理解,要使类 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)

解决方法

根据文档 Self 在这种情况下将是 A,因为 A 是符合协议的,B 只是作为 A 的子类间接执行。

因此,当 A 符合 Copyable 时,您是说 A 及其所有子类必须具有 init(_ instance: A)

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

您实际上可以通过删除 required init(_ instance: A) init 来测试这一点,即使您有 init(_ instance: B),您也会收到错误,因此由于 A 是符合协议的类,因此您必须有一个 init 在哪里instance 参数是 A

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...