如何使用与ObservableObject关联类型的协议?



我正在尝试为必须符合ObservableObject的东西创建一个协议,它将存在于另一个对象Services中:

protocol ThumbnailServiceProtocol: ObservableObject where ObjectWillChangePublisher == ObservableObjectPublisher {
var processingThumbnails: [String] { get }
}
final class ThumbnailService: ThumbnailServiceProtocol {
var processingThumbnails: [String] = []
}
struct Services {
var thumbnailService: ThumbnailServiceProtocol
}
var services = Services(thumbnailService: ThumbnailService())

当我尝试在测试中替换服务以使用mock时,问题出现了,如下所示:

final class MockThumbnailService: ThumbnailServiceProtocol {
var processingThumbnails: [String] = []
}
services = Services(thumbnailService: MockThumbnailService()) /// Cannot convert value of type 'MockThumbnailService' to expected argument type 'ThumbnailServiceProtocol'

我认为问题来自ObservableObject是一个具有关联类型(associatedtype ObjectWillChangePublisher)的协议,但我认为我通过指定where ObjectWillChangePublisher == ObservableObjectPublisher来"填补空白"。

我错过什么了吗?

编辑:澄清,services是一个全局对象,我想在我的单元测试中与Services包含mock的新实例交换,这就是为什么我试图使这项工作:

var services = Services(thumbnailService: ThumbnailService())
services = Services(thumbnailService: MockThumbnailService()) /// Cannot convert value of type 'MockThumbnailService' to expected argument type 'ThumbnailServiceProtocol'

您的示例中的问题是Services.processingThumbnails的类型是ThumbnailService,而不是ThumbnailServiceProtocol。这些类型是不同的。你需要使Services通用。试试这个:

protocol ThumbnailServiceProtocol: ObservableObject {
var processingThumbnails: [String] { get }
}
final class ThumbnailService: ThumbnailServiceProtocol {
var processingThumbnails: [String] = []
}
final class MockThumbnailService: ThumbnailServiceProtocol {
var processingThumbnails: [String] = []
}
struct Services<T> where T: ThumbnailServiceProtocol, T.ObjectWillChangePublisher == ObservableObjectPublisher {
var thumbnailService: T
}
let servicesA = Services(thumbnailService: ThumbnailService())
let servicesB = Services(thumbnailService: MockThumbnailService())

最新更新