在 SwiftUI 中初始化嵌套结构
Posted
技术标签:
【中文标题】在 SwiftUI 中初始化嵌套结构【英文标题】:Initialization of a nested struct in SwiftUI 【发布时间】:2021-12-30 09:01:30 【问题描述】:如何?这个结构将在从 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,感谢您的实际操作,我会采纳您的建议并阅读可选选项,以便更好地了解如何处理它们。
【参考方案1】:
避免可选的合理方法是使用关联值的枚举
例如
enum LoadingState
case idle, loading(Double), loaded(IotShadow), failed(Error)
@Published var state LoadingState = .idle
在状态上查看switch
。
【讨论】:
这看起来是一个结构上不错的解决方案,我会看看我是否可以在我的项目中实现它。谢谢! 好处是您可以根据状态轻松显示不同的视图。loading
的 Double
值可用于进度条。另请参阅 John Sundell 的这篇文章:swiftbysundell.com/articles/handling-loading-states-in-swiftui以上是关于在 SwiftUI 中初始化嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章