Я играю с 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
У вас есть идея, почему?
edit: Я ставлю скелет проекта , если вы хотите проверить