struct ContentView: View {
@State private var tapCounter = 0
var body: some View {
NavigationView {
VStack {
Button("Tap count: \(tapCounter)") {
self.tapCounter += 1
}
}
.navigationBarTitle("SwiftUI")
}
}
}
ContentView
是一个结构体,它可以被创建为一个常量。如果你回想一下你学习结构体的时候,那意味着它是不可变的——我们不能自由地改变它的值。
当创建想要更改属性的结构体方法时,我们需要添加mutating
关键字:mutating func doSomeWork()
,例如。然而,Swift
不允许我们创建可变计算属性,这意味着我们不能编写mutating var body: some View
——这是不允许的。
幸运的是,Swift
为我们提供了一个称为属性包装器的特殊解决方案:我们可以在属性之前放置一个特殊的属性,有效地赋予它们超能力。在存储简单的程序状态(如按钮被点击的次数)的情况下,我们可以使用SwiftUI
中名为@state
的属性包装器。
@State
允许我们绕过结构体的限制:我们知道不能更改它们的属性,因为结构是固定的,但是@State
允许SwiftUI
将该值单独存储在可以修改的地方。
是的,这感觉有点像作弊,你可能想知道为什么我们不使用类-它们可以自由修改。但是相信我,这是值得的:随着你的进步,你会了解到SwiftUI
经常破坏和重新创建你的结构体,所以保持它们的小而简单的结构对性能很重要。
提示:在SwiftUI
中存储程序状态有几种方法,您将学习所有这些方法。@State
是专门为存储在一个视图中的简单属性而设计的。因此,苹果建议我们向这些属性添加私有访问控制,比如:@State private var tapCount = 0
。
作者:韦弦Zhy
链接:https://www.jianshu.com/p/65f3f796a206
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。