[英]Setting protocol which inherits from another protocol as associated type produces error
I'm trying to learn protocols and associatedtypes.我正在尝试学习协议和关联类型。 I have couple of protocols which declare associatedtypes, starting with:
我有几个声明关联类型的协议,从:
protocol MasterViewModel {
associatedtype Item: AWMediaItem
...
}
AWMediaItem
is another protocol AWMediaItem
是另一个协议
protocol AWMediaItem {
var name: String { get }
var source: AWMediaSource { get }
}
And AWAlbum
is yet another protocol which inherits from AWMediaItem AWAlbum
是另一个继承自 AWMediaItem 的协议
protocol AWAlbum: AWMediaItem {
var albumName: String { get }
...
}
For some reason, in a class implementing MasterViewModel
protocol, I cannot set the AWAlbum to be the Item
.出于某种原因,在实现
MasterViewModel
协议的 class 中,我无法将 AWAlbum 设置为Item
。
final class AlbumsMasterViewModel: MasterViewModel {
typealias Item = AWAlbum // Error
...
}
The warning I get is我得到的警告是
- Possibly intended match 'AlbumsMasterViewModel.Item' (aka 'AWAlbum') does not conform to 'AWMediaItem'
可能预期匹配“AlbumsMasterViewModel.Item”(又名“AWAlbum”)不符合“AWMediaItem”
If I understand correctly, all AWAlbum's
will implement AWMediaItem
so why is this not working?如果我理解正确,所有
AWAlbum's
都会实现AWMediaItem
那么为什么这不起作用?
I think you meant to write我想你是想写
final class AlbumsMasterViewModel<Item: AWAlbum>: MasterViewModel {
}
I assume that when you write:我假设当你写:
typealias Item = AWAlbum // Error
you want AlbumsMasterViewModel
's item to conform to your AWAlbum
protocol but you just create a typelias meaning that Item
is just an alias for AWAlbum
.您希望
AlbumsMasterViewModel
的项目符合您的AWAlbum
协议,但您只需创建一个 typelias 意味着Item
只是AWAlbum
的别名。
If you want to use a type alias you need a concrete type conforming to AWMediaItem
, not a protocol inheriting from it.如果要使用类型别名,则需要符合
AWMediaItem
的具体类型,而不是继承自它的协议。 eg:例如:
class ConcreteAlbum: AWAlbum {
var albumName: String
var name: String
var source: AWMediaSource
...
}
final class AlbumsMasterViewModel: MasterViewModel {
typealias Item = ConcreteAlbum // No Error
}
if you want to use AlbumsMasterViewModel
with multiple Item
types you can also declare it that way:如果您想将
AlbumsMasterViewModel
与多个Item
类型一起使用,您也可以这样声明:
final class AlbumsMasterViewModel<Item: AWMediaItem>: MasterViewModel {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.