是否所有 @Published 变量都需要在 SwiftUI 的视图模型中具有初始值?

Posted

技术标签:

【中文标题】是否所有 @Published 变量都需要在 SwiftUI 的视图模型中具有初始值?【英文标题】:Do all @Published variables need to have an initial value in a view model for SwiftUI? 【发布时间】:2020-12-08 22:11:56 【问题描述】:

是否所有@Published 变量都需要在 SwiftUI 的视图模型(我符合 MVVM)中具有初始值?

为什么我不能只说我想要没有初始值的字符串类型的@Published 变量?

这是否意味着我需要:

如果不是,我该如何解决这个问题?

我正在考虑为该类创建一个 init(),但我仍然需要在初始化该类时输入默认值。

【问题讨论】:

classes 没有 structs 拥有的成员初始化器,因此您需要显式提供一个 init 来初始化属性。这不是唯一的@Published 属性 “无初始值的字符串类型”是可选字符串 - String? - 如果这是您想要的,那么更改您的属性的类型。当然,你需要处理解包值,所以你可能会发现一个空字符串是一个更简单的选择 【参考方案1】:

与 SwiftUI 视图不同,它是结构体,可观察对象始终是类,在 Swift 中,所有类都必须有初始化器。

A) 考虑将您的 @Published 变量设为可选

@Published var title: String?

B) 添加初始化方法

init() self.title = ""

否则,有一种方法可以不为类的属性设置初始值。

您可能会发现用“!”展开的力会“解决”你的问题,但这是一种不好的做法,不要这样做;如果您的变量没有初始值,那么在您的情况下它必须是可选的。

但是你为什么要为 SwiftUI 设计一个模型,作为一个可观察的对象,如果你不打算持久化(保存到磁盘)你的数据,请考虑使用简单的结构,否则使用 Core Data 和它的 NSManagedObject 类,即已经符合 ObservableObject。

【讨论】:

【参考方案2】:

所有存储的属性都应该以某种方式初始化。您可以将初始化延迟到构造,例如

final class ViewModel: ObservableObject 
   @Published var title: String

   init(title: String) 
     self.title = title
   

然后,在 SwiftUI 视图中的某个位置,使用上下文所需的值创建它

ViewModel(title: "some value")

【讨论】:

以上是关于是否所有 @Published 变量都需要在 SwiftUI 的视图模型中具有初始值?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 更改 @Published 结构时是不是可以触发 didSet?

类 Observable 对象 @Published 变量始终为空

在子视图中更新 ObservableObject 的 @Published 变量

从另一个对象观察 @Published 变量

如何将我的 SwiftUI 视图的 @State 交换为我的视图模型 @Published 变量?

是否有替代 Combine 的 @Published 来表示值发生变化之后而不是之前的变化?