目标
我的目标是创建一个可重用的视图协议,该协议继承了SwiftUI视图协议并提供了一些默认功能,以在视图内容的状态基础上加载和显示不同的视图。
这样,我就不必为每个视图重新编写相同的代码,使代码更加简洁。
问题
我创建了一个名为“DelayedContentView”的协议,根据视图内容是否已加载,显示两种不同的视图主体。问题在于当我尝试实现它时,“loadedBody”和“unloadedBody”属性不能是“some View”类型,即使它们与SwiftUI视图的Body相关联的类型相同。
背景
我的应用程序中有各种视图,可以从远程获取数据。每个视图都显示两个视图主体:一个用于获取内容时,另一个用于完成获取时。
苹果的SwiftUI视图协议
public protocol View {
associatedtype Body : View
var body: Self.Body { get }
}
我认为的协议
protocol DelayedContentView:View {
func contentLoaded() -> Bool
var loadedBody: Self.Body { get }
var unloadedBody: Self.Body { get }
}
extension DelayedContentView {
//Default implementation that I won't have to rewrite for each view.
var body: some View {
if contentLoaded() {
return self.loadedBody
}else{
return self.unloadedBody
}
}
}
实现
struct ExampleView:DelayedContentView {
func contentLoaded() -> Bool {
//Ask viewModel if content is loaded.
return false
}
var loadedBody: some View {
Text("Content is loaded.")
}
var unloadedBody: some View {
Text("Fetching content...")
}
}
Compile Error: Type 'ExampleView' does not conform to protocol 'DelayedContentView'
我认为协议继承是处理这种情况的正确工具,但也许我错了?