SwiftUI 中有没有办法根据具有值的可选绑定返回不同的视图?

Lew*_*ion 3 swift swiftui combine

我试图在我的视图模型上获取一些数据后显示一个视图(其中数据可以是可选的,因为视图模型只在请求时获取它)。

为什么以下是不可能的/我应该怎么做?

@Binding var someViewModel: SomeViewModel?

var body: some View {
    if let viewModel = self.someViewModel {
        return filledView(with: viewModel)
    }
    return emptyView()
}
Run Code Online (Sandbox Code Playgroud)

此处不起作用的部分是if letSwift UI 视图构建器中的一个。

一种解决方案是有一个单独的 Bool 在加载数据时触发,或者甚至有一个枚举来识别数据何时进入以及何时不存在,但是视图代码充满了不理想的可选值检查。

例如,我想避免做类似的事情:

Image(systemName: someViewModel?.icon.symbol() ?? "plus_sign")
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .frame(width: 60, height: 60)
                    .foregroundColor(Color.red)
                    .padding()
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

LuL*_*aGa 5

你可以使用地图。如果它有一些价值或完全忽略它,它将解开可选项:

var body: some View {
    Group {
        someViewModel.map { FilledView(with: $0) }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Group 比 AnyView 高效得多。AnyView 会阻止编译器优化不必要的层。如果您知道编译时可能有哪些视图,则应该始终使用 Group。仅当可能的视图列表未知时才应使用 AnyView。 (4认同)