如何声明符合具有特定关联类型的协议的变量?

问题描述 投票:0回答:1

我有一个协议来区分两个模型:

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?
}
ios swift
1个回答
0
投票

如果您尝试在协议中使用关联类型,则必须将该类创建为通用类。

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()
© www.soinside.com 2019 - 2024. All rights reserved.