假错误? `初始化前使用的变量` DURING in init()
False error? `Variable used before being initialized` DURING initialization in init()
抱歉,举个毫无意义的例子。试图简化它,仍然不明白发生了什么。以下给了我 Variable 'self.greeting' used before being initialized
:
struct MyView: View {
@State var greeting: String
var length = Measurement<UnitLength>(value: 5, unit: UnitLength.miles)
init() {
greeting = "Hello, World!" // Variable 'self.greeting' used before being initialized
}
var body: some View {
Text(greeting)
}
}
虽然这工作正常(var length
不同;其他相同):
struct MyView: View {
@State var greeting: String
var length = 5 // now Int
init() {
greeting = "Hello, World!"
}
var body: some View {
Text(greeting)
}
}
另外,这是有效的(我在这里删除了 @State
):
struct MyView: View {
var greeting: String // @State removed
var length = Measurement<UnitLength>(value: 5, unit: UnitLength.miles)
init() {
greeting = "Hello, World!"
}
var body: some View {
Text(greeting)
}
}
- 如果编译器要我在
init()
之前初始化greeting
那会在哪里? preinit()
?
- 为什么它认为
greeting
正在“使用”未初始化,而实际上我在这里初始化它?
- 是否有不同的方法来初始化@State 变量?如果是这样,为什么当不相关的 var
length
是 Int
而不是 Measurement
时它会起作用?
此代码:
@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!"
}
和 _greeting
此时未初始化(未指定 initialValue)。是的,错误具有误导性。
我不知道为什么第二个版本有效。未指定 initialValue,并且 String 没有隐式默认值。也许这是 iOS 15 SwiftUI 的一项新功能,它应该可以工作,但由于某些限制而不能在所有情况下工作?
P.S。有类似“preinit”的东西:所有用 length = Measurement<UnitLength>(...)
等表达式分配的属性都在 init 之前 运行,但无法访问它,它是内部的。
抱歉,举个毫无意义的例子。试图简化它,仍然不明白发生了什么。以下给了我 Variable 'self.greeting' used before being initialized
:
struct MyView: View {
@State var greeting: String
var length = Measurement<UnitLength>(value: 5, unit: UnitLength.miles)
init() {
greeting = "Hello, World!" // Variable 'self.greeting' used before being initialized
}
var body: some View {
Text(greeting)
}
}
虽然这工作正常(var length
不同;其他相同):
struct MyView: View {
@State var greeting: String
var length = 5 // now Int
init() {
greeting = "Hello, World!"
}
var body: some View {
Text(greeting)
}
}
另外,这是有效的(我在这里删除了 @State
):
struct MyView: View {
var greeting: String // @State removed
var length = Measurement<UnitLength>(value: 5, unit: UnitLength.miles)
init() {
greeting = "Hello, World!"
}
var body: some View {
Text(greeting)
}
}
- 如果编译器要我在
init()
之前初始化greeting
那会在哪里?preinit()
? - 为什么它认为
greeting
正在“使用”未初始化,而实际上我在这里初始化它? - 是否有不同的方法来初始化@State 变量?如果是这样,为什么当不相关的 var
length
是Int
而不是Measurement
时它会起作用?
此代码:
@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!"
}
和 _greeting
此时未初始化(未指定 initialValue)。是的,错误具有误导性。
我不知道为什么第二个版本有效。未指定 initialValue,并且 String 没有隐式默认值。也许这是 iOS 15 SwiftUI 的一项新功能,它应该可以工作,但由于某些限制而不能在所有情况下工作?
P.S。有类似“preinit”的东西:所有用 length = Measurement<UnitLength>(...)
等表达式分配的属性都在 init 之前 运行,但无法访问它,它是内部的。