gpt4 book ai didi

ios - 如何声明一个符合特定关联类型的协议(protocol)的变量?

转载 作者:行者123 更新时间:2023-11-29 05:54:32 25 4
gpt4 key购买 nike

我有一个用于区分两个模型的协议(protocol):

protocol Differ {
associatedtype Model
func diff(oldModel: Model, newModel: Model)
}

以及一个实现协议(protocol)的具体类:

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

其中我的模拟差异实现了协议(protocol)并使用与实际差异相同的关联类型:

class MockCabinModelDiffer: Differ {
func diff(oldModel: CabinModel, newModel: CabinModel) { }
}

我不知道如何或是否可能在我的管理器中声明 diff 变量,以便它接受任何符合 Differ 协议(protocol)并使用 CabinModel 作为其关联类型。

class CabinManager {
var differ: ??? //what type to declare this as?
}

最佳答案

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

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()

关于ios - 如何声明一个符合特定关联类型的协议(protocol)的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55293833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com