繁体   English   中英

如何将具有关联类型的协议与 ObservableObject 一起使用?

[英]How to use a protocol with associated type with ObservableObject?

我正在尝试为还必须符合ObservableObject的东西创建一个协议,该协议将存在于另一个 object 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())

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

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是一个全局 object ,我想在我的单元测试中用一个包含模拟的新Services实例来替换它,这就是我试图让它工作的原因:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM