【发布时间】:2021-09-29 12:45:25
【问题描述】:
如果我没有 @State 的初始值并将其设置在 init 中,我会收到致命错误:EXC_BAD_ACCESS,但仅限于发布模式
public struct TestSetStateView: View {
@State var item:Int
public init(item: Int) {
self.item = item
}
public var body: some View {
Text("Hello: \(item)")
}
}
如果我添加一个默认值
public struct TestSetStateView: View {
@State var item:Int = 0
public init(item: Int) {
self.item = item
}
public var body: some View {
Text("Hello: \(item)")
}
}
用TestSetStateView(item: 8) 调用它会显示“Hello: 0”
如果我把它移到onAppear
public struct TestSetStateView: View {
@State var item:Int = 0
let firstItem: Int
public init(item: Int) {
firstItem = item
}
public var body: some View {
Text("Hello: \(item)")
.onAppear(perform: {
item = firstItem
})
}
}
并使用TestSetStateView(item: 8) 调用它,它会显示“Hello: 8”,这很棒
或者如果我使用 _ 包装器:
public struct TestSetStateView: View {
@State var item:Int
public init(item: Int) {
_item = State(initialValue: item)
}
public var body: some View {
Text("Hello: \(item)")
}
}
用TestSetStateView(item: 8) 调用它会显示“Hello: 8”,这也很棒!
我只是不确定发生了什么,为什么我可以在onAppear 中使用item = firstItem 而不能在init 中使用。我有点理解 _ 使用 @State 包装器,但为什么我们不必使用 onAppear. 中的
【问题讨论】: