我有 3 個模型類:
protocol IncludedItem {
var id: Int { get }
var text: String { get }
}
protocol PrimaryItem {
associatedtype Included: IncludedItem
var id: Int { get }
var canClose: Bool { get }
var canDelete: Bool { get }
var canSend: Bool { get }
var includedItems: [Included] { get }
}
protocol QuoteItem {
var id: Int { get }
var isSelectable: Bool { get }
}
然后我想使用工廠模式來創建專案。這是我的工廠協議:
protocol QuoteItemFactory {
associatedtype Item: PrimaryItem
var delegate: QuoteItemFactoryDelegate? { get set }
func create(item: Item) -> QuoteItem
}
這是工廠協議的實作:
class OrderQuoteItemFactory: QuoteItemFactory {
weak var delegate: QuoteItemFactoryDelegate?
func create<Item: PrimaryItem>(item: Item) -> QuoteItem {
let viewModel = OrderQuoteViewModel(quote: item)
viewModel.delegate = self
return DefaultQuoteItem.quote(id: item.id, viewModel: viewModel)
}
}
但后來我總是收到以下錯誤:
Type 'OrderQuoteItemFactory' does not conform to protocol 'QuoteItemFactory'.
我究竟做錯了什么?我知道我是否像這樣使用它:
class OrderQuoteItemFactory<Item: PrimaryItem>: QuoteItemFactory {
weak var delegate: QuoteItemFactoryDelegate?
func create(item: Item) -> QuoteItem {
let viewModel = OrderQuoteViewModel(quote: item)
viewModel.delegate = self
return DefaultQuoteItem.quote(id: item.id, viewModel: viewModel)
}
}
我知道像這樣使用它會很完美。但我想知道為什么我不能在函式宣告中使用泛型。
uj5u.com熱心網友回復:
如果您將工廠協議更改為此怎么辦?
protocol QuoteItemFactory {
var delegate: QuoteItemFactoryDelegate? { get set }
func create<Item: PrimaryItem>(item: Item) -> QuoteItem
}
我注意到(至少從您的示例中)您實際上并不需要 a associatedType,因此您可以將函式本身設為通用,而不是協議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405263.html
標籤:
上一篇:C#隱式運算子泛型減/加int
