首页 > 解决方案 > @EnvironmentObject 符合协议:Xcode 未编译

问题描述

我正在使用 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.swiftXcode 中使用所有这些时,永远不会结束编译。看起来环境对象导致了这个:

@EnvironmentObject var placesQueryInterface: PlacesQueryInterface

你知道为什么吗?

编辑:如果你想测试,我放了一个项目骨架

标签: swiftswiftui

解决方案


在 beta 3 中,无休止的编译已得到修复,但是,它会立即返回并出现错误。现在你可以看到你真正的问题是什么:

在此处输入图像描述

@EnvironmentObject var placesQueryInterface: (FetcherInterface & PlacesQueryInterface)

推荐阅读