我有一個映射器如下
protocol MapperProtocol {
associatedtype T
associatedtype U
func map(item: T) -> U?
}
我想將它注入到一個類中,如下所示
protocol ParserProtocol {
associatedtype T
associatedtype U
func parse(from: T) -> U?
}
class TrackParser: ParserProtocol {
typealias T = String
typealias U = Track
private let mapper: MapperProtocol
init(mapper: MapperProtocol) {
self.mapper = mapper
}
func parse(from path: String) -> Track? {
guard let data = try? Data(contentsOf: URL(filePath: path)) else { return nil }
return mapper.map(item: data)
}
}
TrackParser將從其他地方初始化,因此它不需要知道映射器的具體型別。
當我想以這種方式實作它時,會出現以下錯誤。
任何想法如何解決它?
uj5u.com熱心網友回復:
請注意,parse實作要求映射器具有T == Dataand U == Track,但您沒有在TrackParser.
我們可以制作T和U的主要關聯型別,MapperProtocol這樣同型別的需求就可以很容易地指定為MapperProtocol<Data, Track>。
protocol MapperProtocol<T, U> { // Notice the "<T, U>"
associatedtype T
associatedtype U
func map(item: T) -> U?
}
此外,從 Swift 5.7 開始,存在型別需要以 " any" 為前綴,所以你可以這樣寫:
private let mapper: any MapperProtocol<Data, Track>
init(mapper: any MapperProtocol<Data, Track>) {
self.mapper = mapper
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519884.html
標籤:IOS迅速仿制药快速协议
上一篇:在Rust中將結構轉換為具有關聯型別的trait物件
下一篇:不同泛型的打字稿陣列
