我有此代码:
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
作为属性。到目前为止一切顺利。
但是为什么这里需要关联类型才能编译代码?为什么不编译?
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
始终是ProtocolB
。我现在也无法访问在MyView
中定义的任何属性。
两个代码有什么区别?看起来它们确实一样。为什么关联类型允许子类,为什么“普通”类型不允许子类?