关联类型和“普通”类型之间的区别?

时间:2018-11-28 19:01:09

标签: swift protocols swift-protocols

我有此代码:

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,因此是ProtocolBMyClass符合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中定义的任何属性。

两个代码有什么区别?看起来它们确实一样。为什么关联类型允许子类,为什么“普通”类型不允许子类?

0 个答案:

没有答案