【问题标题】:How could I initialize the @State variable in the init function in SwiftUI?如何在 SwiftUI 的 init 函数中初始化 @State 变量?
【发布时间】:2020-03-04 14:28:15
【问题描述】:

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

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!")
    }
}

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

【问题讨论】:

    标签: state swiftui init


    【解决方案1】:

    我觉得写代码的时候最好初始化一下,就像:

    @State var mapState = 0
    

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

    您有更多信息https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-binding-property-wrapper

    【讨论】:

      【解决方案2】:

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

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

      使用属性包装器@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")
          }
      }
      

      【讨论】:

        【解决方案3】:

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

        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!")
            }
        }
        

        【讨论】:

        • _mapState = State(initialValue: inputMapState)
        • 那个 uderscore 和 .init 函数解决了我的问题。这比在视图本身上使用.onAppear() 更可取吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        相关资源
        最近更新 更多