为什么当我将计时器添加到视图时,这段代码不正确:
class Dummy {
}
struct DemoView: View {
@State var timer: Cancellable? = nil
@State var dummy: Dummy
init(dummy_in: Dummy) {
dummy = dummy_in //>>> ERROR: Variable 'self.dummy' used before being initialized
// SOME MORE LOGIC HERE
}
var body: some View {
Text("Dummy")
}
}
字符串
它工作得很好,直到我添加了一个计时器,它是用nil初始化的,因为它是空的。
这是非常不直观的行为
编辑:当我将dummy更改为@ObservedObject时,它确实有效。仍然想了解这里发生了什么
2条答案
按热度按时间zqdjd7g91#
苹果表示,关于
State(wrappedValue value: Value)
你不能直接调用这个初始化器。
https://developer.apple.com/documentation/swiftui/state/init(wrappedvalue:)
您可以使用
字符串
另外,请记住,
State
是一个真实的来源,而不是来自父节点,它处理View
的身份,当父节点试图给予值时,通常会有更多的断开。State
也应该总是标记为private
,这样就不会创建memberwise初始化器。https://developer.apple.com/documentation/swiftui/state的
init
在SwiftUI中并不是一个好主意,SwiftUI可以随时重新创建View
,计时器可能会导致View
被重新创建。cetgtptt2#
要将数据传递到View中,则为
let
(仅就绪)或@Binding var
(读/写),例如字符串
在这两种情况下,
body
都是在值被改变时被调用的。因为它只适用于值类型,所以Dummy
必须被改变为结构体:型
仅供参考,计时器使用
TimelineView