【问题标题】:Initialization of a nested struct in SwiftUI在 SwiftUI 中初始化嵌套结构
【发布时间】:2021-12-30 09:01:30
【问题描述】:

如何在 SwiftUI 中初始化嵌套结构?这个结构将在从 RESTAPI 解析 JSON 后填充,但我想让它作为 Observable 可用,以便我的视图稍后可以在填充数据时访问它。

final class APIController: ObservableObject { 
@Published var iotshadow: IotShadow

IotShadow 是几个层次的嵌套结构。逐行为其分配默认值似乎非常过分。另外,如果我将其保留为可选IotShadow?,那么我似乎不允许访问它,因为它抱怨需要解开该值。

在这种情况下,初始化结构的正确方法是什么? Swift 新手,但经验丰富的 Java/C 程序员,所以也许我在这里的想法是错误的。

谢谢, 马库斯

【问题讨论】:

  • 如果您将其定义为可选(使用 ?),那么是的,您必须在访问它之前检查它是否为 nil。我建议阅读 Swift 选项。您能否显示您在展开时遇到的代码/错误。谢谢
  • @Fogmeister 这是我得到的错误“可选类型'IotShadow的值?'必须解包以引用已包装基本类型“IotShadow”的成员“状态””,它来自打印语句iotshadow = try! JSONDecoder().decode(IotShadow.self, from: jsonData) print("Reported Relay1: \(iotshadow.state.desired.RELAY1)")
  • IotShadow 是可选的,所以我认为您需要添加一个 ?在您的打印行中的iotShadow 之后。一定要阅读如何使用可选的。它们是 Swift 中所有开发的核心。知道如何以及为什么使用它们非常重要。 ??????????
  • @Fogmeister,感谢您的实际操作,我会采纳您的建议并阅读可选选项,以便更好地了解如何处理它们。

标签: ios swift swiftui


【解决方案1】:

避免可选的合理方法是使用关联值的枚举

例如

enum LoadingState {
    case idle, loading(Double), loaded(IotShadow), failed(Error)
}

@Published var state LoadingState = .idle

在状态上查看switch

【讨论】:

  • 这看起来是一个结构上不错的解决方案,我会看看我是否可以在我的项目中实现它。谢谢!
  • 好处是您可以根据状态轻松显示不同的视图。 loadingDouble 值可用于进度条。另请参阅 John Sundell 的这篇文章:swiftbysundell.com/articles/handling-loading-states-in-swiftui
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多