这段代码:
@State var greeting: String
在幕后创建一个支持变量:
let _greeting: State<String>
如果你想在 init() 中自己初始化它,你可以这样做:
init() {
_greeting = new State<String>(initialValue: "Hello, World!")
}
但由于你有一个常量,所以像这样设置它会更简单:
@State var greeting: String = "Hello, World!"
第三个变体有效,因为没有 @State 就没有魔法。
第一个选项不起作用,因为代码被翻译为:
init() {
self._greeting.wrappedValue = "Hello, World!"
}
and _greeting
此时尚未初始化(未指定初始值)。是的,该错误具有误导性。
我不知道为什么第二个版本有效。未指定初始值,并且字符串没有隐式默认值。也许这是 iOS 15 SwiftUI 的一项新功能,应该可以使用,但由于某些限制,并非在所有情况下都可以使用?
附:有一些类似“preinit”的东西:用一些表达式分配的所有属性,例如length = Measurement<UnitLength>(...)
在 init 之前运行,但无法访问它,它是内部的。