在SwiftUI开发中流传一种说法:视图是状态的函数。这句话什么意思呢?
我们在玩游戏的时候,死了几次,得到几分,收集了一些道具,或者捡到武器,在应用程序中,我们把这些称为state。当你退出游戏的时候状态都会保存,当你下次再进来游戏的时候可以接着上次的继续玩。不过在你玩的过程中,这些所有的东西都可以叫状态:所有的integers,strings,booleans等等,这些存储在内存中的值描述着你现在在干嘛。
回到开头的疑问,我们说SwiftUI的视图们是状态的函数,其实意思是说,页面呈现给我们的样子都由程序的状态来决定,不管是能看到的,还是可以进行交互的内容。比如只有在输入框中填入了内容,我们才能继续进行下一步。而在传统的观念中:用户界面是由一系列事件决定的。我们现在能看到当前页面,是因为我们使用app过程中,点击了某些地方,或者登录了应用,刷新了数据等等。
如何修改状态?
说了这么多,那在SwiftUI中我们应该如何处理状态呢?我们先以一个按钮的例子开始:
struct ContentView: View {
var tapCount = 0
var body: some View {
Button("Tap Count: \(tapCount)") {
self.tapCount += 1
}
}
}
假如有上面的一个按钮,它有一个title,以及一个action,在按钮点击的时候改变属性tapCount的值。是不是看起来很合理?
实际上上面的代码在swift中是会报错的。ContentView是一个struct,而我们知道结构体是不可变的,所以我们不能随意改变它的值。
在创建一个结构体的方法之后,如果想在方法中修改属性的值,我们需要添加mutating关键字,比如这样: