在阅读了一篇关于在协议中使用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
问题内容: 除了带有协议扩展的语法外: …我偶然发现您可以在协议本身上使用相同的where子句: 请注意,这是 不 一样的where子句限制一个通用的协议,并 没有 自己做P上的通用协议。 我的实验似乎表明,此处只能使用冒号,并且冒号后面的内容必须是类或协议(可能是通用的)。 我很好奇:这是怎么逃避我的注意的?所以我去寻找它何时出现的证据。在Swift 3.0中,前一种语法是合法的,但后者 则不
问题内容: 如何列出在Swift中实现给定协议的所有类? 说我们有一个例子: 这是我当前的(不可编译)方法: 但是当打电话给 要么 要么 导致Xcode错误:无法将类型(Animal.Protocol).Type的值转换为预期的参数类型’Protocol’。 有人设法使这个工作正常吗? 问题答案: 由于您使用的是Objective-C运行时来获取类型自省,因此需要以这种方式添加到代码中: 请注意,
问题内容: 在Objective-C中: 在Swift中: 但是,将出现一条错误消息: 类型“ CellDatasDataSource”不符合协议“ NSObjectProtocol” 类型“ CellDatasDataSource”不符合协议“ UITableViewDataSource” 正确的方法应该是什么? 问题答案: 类型“ CellDatasDataSource”不符合协议“ NSOb
问题内容: 在下面的代码中,我想测试是否为。如果是的话,我想作为。你怎么做到这一点?如果不使用强制转换,则使用其他技术。 那里的最后一行不会编译。错误是: 协议“ SpecialController”仅具有通用要求或关联类型要求,因此只能用作通用约束。 问题答案: 不幸的是,Swift当前不支持将具有关联类型的协议用作实际类型。但是,从技术上讲这对于编译器是可行的。并且很可能在该语言的未来版本中实
本文向大家介绍javaweb中Http协议详解,包括了javaweb中Http协议详解的使用技巧和注意事项,需要的朋友参考一下 一、什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资
问题内容: 我有一个协议,该协议继承自另一个协议,并且满足扩展要求。 还有另一种协议,其要求()应该为。 现在,如果我尝试使用as ,那么它将无法编译。它说, 推断的类型“地址”(通过匹配要求“ valueForDetail”)无效:不符合“ Validator”。 这种用法非法吗?我们不能像所有的那样用它代替。 下面是我正在尝试的代码。 更新: 提交了一个错误。 问题答案: David已经提到的