【问题标题】:Difference between SwiftUI State initializersSwiftUI 状态初始化器之间的区别
【发布时间】:2019-10-20 14:39:51
【问题描述】:

初始化@State变量时,有两个初始化器:

/// Initialize with the provided initial value.
public init(wrappedValue value: Value)

/// Initialize with the provided initial value.
public init(initialValue value: Value)

这两个初始化器之间有区别还是它们做的一样? 在创建新的@State 变量时,是否首选使用其中之一?

【问题讨论】:

  • 我不明白为什么这被否决了。对我来说似乎是一个很好的问题。

标签: swift swiftui


【解决方案1】:

根据swift-evolution proposal

init(initialValue:) 已重命名为 init(wrappedValue:) 以匹配属性名称。

从 Swift 5.1 开始,两者都可用,并且没有一个被标记为已弃用。我仍然建议使用init(wrappedValue:)

【讨论】:

    【解决方案2】:

    你不能直接调用这个初始化器(init(wrappedValue:))。相反,用@State 属性声明一个属性,并提供一个初始值;例如,@State private var isPlaying: Bool = false。

    仅供参考:https://developer.apple.com/documentation/swiftui/state/3365450-init

    我们使用 init(initialValue:) 来创建具有初始值的状态。

    例如:

    struct TestView3: View {
        @ObservedObject var data = TestData.shared
        @State private var sheetShowing = false
        var body: some View {
            print("test view3 body, glabel selected = \(data.selected)"); return
            VStack {
                Text("Global").foregroundColor(data.selected ? .red : .gray).onTapGesture {
                    self.data.selected.toggle()
                }.padding()
                Button(action: {
                    self.sheetShowing = true
                    print("test view3, will show test view4")
                }) { Text("Show TestView4") }.padding()
            }.sheet(isPresented: $sheetShowing) { TestView4(selected: self.data.selected) }
        }
    }
    
    struct TestView4: View {
        @ObservedObject var data = TestData.shared
        @State private var selected = false
        init(selected: Bool) {
            self._selected = State(initialValue: selected)   // <-------- here
            print("test view4 init, glabel selected = \(data.selected), local selected = \(self.selected)")
        }
        var body: some View {
            print("test view4 body, glabel selected = \(data.selected), local selected = \(selected)"); return
            VStack {
                Text("Local").foregroundColor(selected ? .red : .gray).onTapGesture {
                    self.selected.toggle()
                    print("test view4, local toggle")
                }.padding()
                Text("Global").foregroundColor(data.selected ? .red : .gray).onTapGesture {
                    self.data.selected.toggle()
                    print("test view4, global toggle")
                }.padding()
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 2023-03-07
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2021-04-12
      相关资源
      最近更新 更多