簡體   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