首页 > 解决方案 > 关联类型和“正常”类型之间的区别?

问题描述

我有这个代码:

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因为它具有ProtocolBas 属性。到目前为止,一切都很好。

但是为什么这里需要关联类型才能编译代码呢?为什么这不编译?

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()

但这很奇怪,因为MyViewis always ProtocolB。我现在也无法访问任何定义的属性MyView

两个代码有什么区别?看起来他们真的是一样的。为什么关联类型允许子类,为什么“正常”类型不允许?

标签: swiftprotocolsswift-protocols

解决方案


推荐阅读