【发布时间】:2020-06-18 18:08:44
【问题描述】:
我正在尝试学习协议和相关类型。我有几个声明关联类型的协议,从:
protocol MasterViewModel {
associatedtype Item: AWMediaItem
...
}
AWMediaItem 是另一个协议
protocol AWMediaItem {
var name: String { get }
var source: AWMediaSource { get }
}
AWAlbum 是另一个继承自 AWMediaItem 的协议
protocol AWAlbum: AWMediaItem {
var albumName: String { get }
...
}
由于某种原因,在实现MasterViewModel 协议的类中,我无法将 AWAlbum 设置为Item。
final class AlbumsMasterViewModel: MasterViewModel {
typealias Item = AWAlbum // Error
...
}
我得到的警告是
- 可能有意匹配“AlbumsMasterViewModel.Item”(又名“AWAlbum”)不符合“AWMediaItem”
如果我理解正确,所有AWAlbum's 都会实现AWMediaItem 那么为什么这不起作用?
【问题讨论】:
-
AWMediaItem中name和source的实现在哪里?即使在某个基于协议的环境中,也必须实现协议要求。 -
在实现此协议的结构/类中。我认为在这种情况下没有任何区别