SwiftUI - 属性包装器`@State`理解

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
来源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(SwiftUI - 属性包装器`@State`理解)