在我的域模塊中,我定義了一個協議分配、時間日志和分配時間日志。
在定義具體實作時,我想使用泛型來符合 AssignmentTimeLog 協議。為此,我將我的通用 A、T 引數限制為 Domain.Assignment 和 Domain.TimeLog 型別。為什么這不滿足協議要求?我想了解正在發生的事情的邏輯。
// Domain Module
public protocol AssignmentTimeLog {
var assignment: Assignment { get }
var timeLog: TimeLog { get }
}
// My attempt to create an implementation trows an error
// Error:
// Type 'AssignmentTimeLog<A, T>' does not conform to protocol 'AssignmentTimeLog'
import Domain
struct AssignmentTimeLog<A, T>:
Domain.AssignmentTimeLog where A: Domain.Assignment, T: Domain.TimeLog {
var assignment: A
var timeLog: T
}
對于背景關系:使用泛型的原因是稍后我想在 AssignmentTimeLog 上定義一個擴展,其中 A & T 還實作了另一個協議。這提供了額外的功能而無需額外的代碼。具體型別實作域協議以及那些附加協議。
我試圖通過閱讀檔案和多個博客來弄清楚這一點。但我似乎無法深入了解我所擁有的確切問題/差距。
uj5u.com熱心網友回復:
該協議與您的實作所說的不同。
事實 1
根據協議,這個吸氣劑
var assignment: Assignment { get }
可以回傳任何符合Assignment.
事實 2
另一方面,您在這里的實施
var assignment: A
表示assignment將包含特定型別的值A(恰好符合Assignment)。
這是兩種截然不同的說法。
修復
這是一個簡單的修復
protocol AssignmentTimeLog {
associatedtype A: Assignment
associatedtype B: TimeLog
var assignment: A { get }
var timeLog: B { get }
}
struct MyAssignmentTimeLog<A, T>: AssignmentTimeLog where A: Assignment, T: TimeLog {
var assignment: A
var timeLog: T
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429154.html
