繁体   English   中英

将从另一个协议继承的协议设置为关联类型会产生错误

[英]Setting protocol which inherits from another protocol as associated type produces error

我正在尝试学习协议和关联类型。 我有几个声明关联类型的协议,从:

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协议的 class 中,我无法将 AWAlbum 设置为Item

final class AlbumsMasterViewModel: MasterViewModel {
    typealias Item = AWAlbum // Error
...
}

我得到的警告是

  1. 可能预期匹配“AlbumsMasterViewModel.Item”(又名“AWAlbum”)不符合“AWMediaItem”

如果我理解正确,所有AWAlbum's都会实现AWMediaItem那么为什么这不起作用?

我想你是想写

final class AlbumsMasterViewModel<Item: AWAlbum>: MasterViewModel {
    
}

我假设当你写:

    typealias Item = AWAlbum // Error

您希望AlbumsMasterViewModel的项目符合您的AWAlbum协议,但您只需创建一个 typelias 意味着Item只是AWAlbum的别名。

如果要使用类型别名,则需要符合AWMediaItem的具体类型,而不是继承自它的协议。 例如:

class ConcreteAlbum: AWAlbum {
    var albumName: String
    var name: String
    var source: AWMediaSource
    ...    
}

final class AlbumsMasterViewModel: MasterViewModel {
    typealias Item = ConcreteAlbum // No Error
}

编辑

如果您想将AlbumsMasterViewModel与多个Item类型一起使用,您也可以这样声明:

final class AlbumsMasterViewModel<Item: AWMediaItem>: MasterViewModel {
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM