-
对于
@State
修饰的属性的访问,只能发生在body
或者body
所调用的方法中。你不能在外部改变@State
的值,只能@State
初始化时,设置初始化值,它的所有相关操作和状态改变都应该是和当前View
生命周期保持一致。 -
在引用包装为
@State
的属性是,如果是读写都有,引用属性需要$
开头,如果只读直接使用变量名即可 -
State
针对具体View
的内部变量进行管理,不应该从外部被允许访问,所以应该标记为private
import SwiftUI
struct User {
var firstName = "Tylor"
var lastName = "Swift"
}
struct UseStateView: View {
@State var isToggleSelected = false
@State private var user = User()
var body: some View {
Form(content: {
Section(content: {
Toggle(isOn: $isToggleSelected) {
Text("是否选中")
}
})
Section(content: {
Text("Your name is \(user.firstName) \(user.lastName).")
TextField("firstName",text: $user.firstName)
TextField("lastName", text: $user.lastName)
})
})
.navigationBarTitle("State的使用",displayMode: .inline)
}
}
struct UseStateView_Previews: PreviewProvider {
static var previews: some View {
UseStateView()
}
}
-
值类型仅有独立的拥有者,而
class
类型可以多个指向一个;对于两个SwiftUI
View
而言,即使发送给他们两个相同的struct
对象,事实上他们每个View
都得到了一份独立的struct
的拷贝,所以其中一个View
的struct
值发生变化,对另一个没有影响;反之,如果是class
则会互相影响; -
当
User
是一个结构体时,每次我们修改这个结构体的属性时,Swift
实际上是在创建一个新的结构体实例。@State
能够发现这个变化,并自动重新加载我们的视图。现在如果改为class
,我们有了一个类,这种行为就不再发生,Swift
可以直接修改值。