[英]How to use Swinject to register protocol conforming to 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.