协议中的 Self 如何在子类中解释?
How is Self in protocol interpreted in subclass?
在阅读了一篇关于在协议中使用 Self
的 discussion 之后,我做了一个实验(见下面的代码)。我认为代码将无法编译,因为根据我的理解,class 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 的子 class 间接执行此操作。
所以当 A 符合 Copyable
你是说 A 和它的所有子 class 必须有一个 init(_ instance: A)
In a protocol declaration or a protocol member declaration, the Self type refers to the eventual type that conforms to the protocol.
你实际上可以通过删除 required init(_ instance: A)
init 来测试它,即使你有一个 init(_ instance: B)
,你也会得到一个错误,所以因为 A 是符合协议的 class你必须有一个初始化,其中 instance
参数是 A
在阅读了一篇关于在协议中使用 Self
的 discussion 之后,我做了一个实验(见下面的代码)。我认为代码将无法编译,因为根据我的理解,class 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 的子 class 间接执行此操作。
所以当 A 符合 Copyable
你是说 A 和它的所有子 class 必须有一个 init(_ instance: A)
In a protocol declaration or a protocol member declaration, the Self type refers to the eventual type that conforms to the protocol.
你实际上可以通过删除 required init(_ instance: A)
init 来测试它,即使你有一个 init(_ instance: B)
,你也会得到一个错误,所以因为 A 是符合协议的 class你必须有一个初始化,其中 instance
参数是 A