如何在 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!")
}
}
让我们看一下简单的源代码:
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!")
}
}