如何在 SwiftUI 的 init 函数中初始化 @State 变量?

How could I initialize the @State variable in the init function in SwiftUI?

让我们看一下简单的源代码:

import SwiftUI

struct MyView: View {
    @State var mapState: Int
    
    init(inputMapState: Int)
    {
        mapState = inputMapState //Error: 'self' used before all stored properties are initialized
    } //Error: Return from initializer without initializing all stored properties
    
    var body: some View {
        Text("Hello World!")
    }
}

这里需要初始化函数,因为我想在这里加载一些数据,但是有一个问题,@State变量不能在这里初始化!我该怎么办? 也许这是一个非常简单的问题,但我不知道该怎么做。 非常感谢!

我觉得还是写代码的时候初始化好,比如:

@State var mapState = 0

或者,如果您想将该值与另一个视图绑定,请使用 @Binding

您在 https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-binding-property-wrapper

上有更多信息

我们可以注入视图需要的数据。

使用了可以访问所需数据的模型。创建一个地图视图并在您的父视图中使用它的实例。这也将有助于对模型进行单元测试。

使用 属性 包装器 @Binding 将数据从父视图传递到 MapView 并使用 _mapState 保存 mapState 的值。

struct Model {
 //some data
}

struct MapView {
    private let model: Model
    @Binding var mapState: Int

    init(model: Model, mapState: Binding<Int>) {
        self.model = model
        self._mapState = mapState
    }
}

extension MapView: View {

    var body: some View {
        Text("Map Data")
    }
}

属性 包装器正在为您生成一些代码。你需要知道的是,实际生成的存储属性是wrapper的类型,因此你需要使用它的构造函数,它的前缀是_。在您的情况下,这意味着 var _mapState: State<Int>,因此按照您的示例:

import SwiftUI

struct MyView: View {
    @State var mapState: Int

    init(inputMapState: Int)
    {
        _mapState = /*State<Int>*/.init(initialValue: inputMapState)
    }

    var body: some View {
        Text("Hello World!")
    }
}