簡體   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