是否所有 @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(),但我仍然需要在初始化该类时输入默认值。
【问题讨论】:
class
es 没有 struct
s 拥有的成员初始化器,因此您需要显式提供一个 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 变量