我有一个协议来区分两个模型:
protocol Differ {
associatedtype Model
func diff(oldModel: Model, newModel: Model)
}
以及实现协议的具体类:
class CabinModelDiffer: Differ {
func diff(oldModel: CabinModel, newModel: CabinModel) { }
}
模型只是一个具有一些属性的类:
class CabinModel { //some properties... }
最后,我有一个包含不同的更高级别的类:
class CabinManager {
var differ: CabinModelDiffer?
}
我可以创建并分配不同的:
let manager = CabinManager()
manager.differ = CabinModelDiffer()
我的问题是,我希望能够为管理器分配一个模拟不同的单元测试,如下所示:
manager.differ = MockCabinModelDiffer() //Error: Cannot assign value of type
我的模拟不同的地方实现了协议,并使用与实际不同的相关类型:
class MockCabinModelDiffer: Differ {
func diff(oldModel: CabinModel, newModel: CabinModel) { }
}
我无法弄清楚如何,或者甚至可能,在我的经理中声明差异变量,以便它接受任何符合Differ
协议的类型并使用CabinModel
作为其关联类型。
class CabinManager {
var differ: ??? //what type to declare this as?
}
如果您尝试在协议中使用关联类型,则必须将该类创建为通用类。
protocol Differ {
associatedtype Model
func diff(oldModel: Model, newModel: Model)
}
class CabinModel {
}
class CabinModelDiffer: Differ {
func diff(oldModel: CabinModel, newModel: CabinModel) { }
}
class CabinManager<T: Differ> where T.Model == CabinModel {
var differ: T?
}
let manager = CabinManager<CabinModelDiffer>()
manager.differ = CabinModelDiffer()
class MockCabinModelDiffer: Differ {
func diff(oldModel: CabinModel, newModel: CabinModel) { }
}
let manager1 = CabinManager<MockCabinModelDiffer>()
manager1.differ = MockCabinModelDiffer()