在阅读了一篇关于在协议中使用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)
根据文档,在这种情况下Self将是A,因为A是符合协议的,所以B只是间接地作为A的子类来做它。
因此,当A符合copyable
时,您是说A及其所有子类必须有一个init(_instance:A)
在协议声明或协议成员声明中,Self类型是指符合协议的最终类型。
实际上,您可以通过删除必需的init(_instance:A)
init,并且即使您有init(_instance:B)
也会得到一个错误,因此,由于A是符合协议的类,您必须有一个init,其中instance
参数是A