我正在使用SwiftUI,并且想抽象一个@EnvironmentObject
。目标是从生产BindableObject
切换到伪造产品(测试/在本地工作...)
首先,我刚刚声明了一个协议:
protocol FetcherInterface: BindableObject {
associatedtype T
var didChange: PassthroughSubject<[T], Never> { get set }
var values: [T] { get set }
}
然后我可以写一个符合FetcherInterface
的网络根类:
open class NetworkFetcher<T: Decodable>: FetcherInterface {
public var didChange = PassthroughSubject<[T], Never>()
internal var values: [T] = [T]() {
didSet {
DispatchQueue.main.async {
dump("did set network values \(self.values)")
self.didChange.send(self.values)
}
}
}
internal func loadAsync(values: [T]) {
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
self.values = values
}
}
}
我现在可以拥有一个像这样的子班:
final class PlacesNetworkFetcher: NetworkFetcher<Place>, PlacesQueryInterface {
func loadPlacesFromCountryCode(_ countryCode: String) {
self.loadAsync(values: [Place(id: UUID(), name: "London")])
}
}
与PlacesQueryInterface
:
protocol PlacesQueryInterface {
func loadPlacesFromCountryCode(_ countryCode: String)
}
extension PlacesQueryInterface where Self: FetcherInterface {}
当我想在我的ContentView.swift
Xcode中使用所有这些内容时,永远不要结束编译。
看起来是环境对象引起了这个问题:
@EnvironmentObject var placesQueryInterface: PlacesQueryInterface
您知道为什么吗?
编辑:如果您想测试,我会放一个project skeleton