State的学习与使用

本文探讨了SwiftUI中@State属性的访问规则,强调其与View生命周期的一致性,以及值类型和class类型在属性修改上的区别。重点讲解了如何正确使用@State和保护内部变量,以及类与结构体对视图更新的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 对于@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的拷贝,所以其中一个Viewstruct值发生变化,对另一个没有影响;反之,如果是class则会互相影响;

  • User是一个结构体时,每次我们修改这个结构体的属性时,Swift实际上是在创建一个新的结构体实例。@State能够发现这个变化,并自动重新加载我们的视图。现在如果改为class,我们有了一个类,这种行为就不再发生,Swift可以直接修改值。

上述案例运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值