提问者:小点点

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


在阅读了一篇关于在协议中使用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个答案

匿名用户

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

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

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

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