假错误? `初始化前使用的变量` 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)
    }
}

此代码:

@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 之前 运行,但无法访问它,它是内部的。