我正在使用 SwiftUI 并想抽象一个@EnvironmentObject. 目标是从生产切换BindableObject到假的(测试/本地工作......)
首先,我刚刚声明了一个协议:
protocol FetcherInterface: BindableObject {
associatedtype T
var didChange: PassthroughSubject<[T], Never> { get set }
var values: [T] { get set }
}
Run Code Online (Sandbox Code Playgroud)
然后我可以编写一个符合以下条件的网络根类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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在可以有一个这样的子类:
final class PlacesNetworkFetcher: NetworkFetcher<Place>, PlacesQueryInterface {
func loadPlacesFromCountryCode(_ countryCode: String) {
self.loadAsync(values: [Place(id: UUID(), name: "London")])
}
}
Run Code Online (Sandbox Code Playgroud)
与PlacesQueryInterface:
protocol PlacesQueryInterface {
func loadPlacesFromCountryCode(_ countryCode: String)
}
extension PlacesQueryInterface where Self: FetcherInterface {}
Run Code Online (Sandbox Code Playgroud)
当我想在我的ContentView.swiftXcode 中使用所有这些时,永远不会结束编译。看起来环境对象导致了这个:
@EnvironmentObject var placesQueryInterface: PlacesQueryInterface
你知道为什么吗?
编辑:如果你想测试,我放了一个项目骨架
在 beta 3 中,永无休止的编译已得到修复,但是,它会立即返回错误。现在您可以看到真正的问题是什么:
@EnvironmentObject var placesQueryInterface: (FetcherInterface & PlacesQueryInterface)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |