swift - 关联类型和“正常”类型之间的区别?
问题描述
我有这个代码:
import UIKit
protocol ProtocolA {
associatedtype View: ProtocolB
var someView: View { get }
}
protocol ProtocolB { }
class MyView: UIView, ProtocolB {}
class MyClass: ProtocolA {
var someView = MyView()
}
这编译。MyView
符合ProtocolB
,因此是ProtocolB
. MyClass
符合,ProtocolA
因为它具有ProtocolB
as 属性。到目前为止,一切都很好。
但是为什么这里需要关联类型才能编译代码呢?为什么这不编译?
import UIKit
protocol ProtocolA {
var someView: ProtocolB { get }
}
protocol ProtocolB { }
class MyView: UIView, ProtocolB {}
class MyClass: ProtocolA { // Error here, it doesn't conform to ProtocolA.
var someView = MyView()
}
为什么?!MyView
还是ProtocolB
对吗?我可以通过这样做来解决这个问题:
var someView: ProtocolB = MyView()
但这很奇怪,因为MyView
is always ProtocolB
。我现在也无法访问任何定义的属性MyView
。
两个代码有什么区别?看起来他们真的是一样的。为什么关联类型允许子类,为什么“正常”类型不允许?
解决方案
推荐阅读
- c# - 对于异步文件 I/O 任务,流本身是否需要异步?
- nestjs - 多个验证管道
- csv - 从文件读取时,CsvHelper 在字符串中添加前导零
- android - 自定义 ViewPager2 后退
- ruby-on-rails - 是否可以从 Papertrail 版本重新创建历史变更集?
- youtube - 将 botguarddata 转换为响应
- java - java.security.NoSuchAlgorithmException:没有这样的算法:提供者 BC 的 SHA256WITHRSA
- reactjs - 有没有办法在 ant design 的选择选项上设置默认值?
- java - Vaadin ComboBox 将文本字段宽度设置为 0 (CSS shadow dom)
- vba - 尝试使用 CopyValues 时出现错误“编译错误:未定义子或函数”