如何解决子类中如何解释协议中的 Self ?
在阅读了关于在协议中使用 Self
的 discussion 后,我做了一个实验(见下面的代码)。我认为代码将无法编译,因为根据我的理解,要使类 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。