[英]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
...
}
我得到的警告是
- 可能預期匹配“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.