在 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

【讨论】:

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

以上是关于在 SwiftUI 中初始化嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI制作View可嵌套组件

结构中的 Swift/SwiftUI 属性初始化程序错误

在 SwiftUI 中将 FileDocumentReadConfiguration 传递给文档结构的初始化程序

在视图结构中初始化成员

SwiftUi 初始化一个类中的主结构

如何在 SwiftUI 中再次初始化 View?