SwiftUI踩坑记之@State初始化之谜

问题

最近在写 SwiftUI 的时候遇到了一件怪事。

Swift 复制代码
struct AView: View {
    @State private var content: String
    var body: some View {
        Text(content)
    }
}

#Preview {
    AView(content: "Test")
}

上面的代码没有问题,参数可以传递给 AView@state 标记的参数 content

紧接着我们把 conten 变成 optional,结果还是一样符合预期。

Swift 复制代码
struct AView: View {
    @State private var content: String?
    var body: some View {
        Text(content ? "")
    }    
}

#Preview {
    AView(content: "Test")
}

不过当我们给 View 添加初始化方法后,奇怪的事情就开始出现了。外面的参数无法传递给 conten 了,最终 Aview 展示了空字符串。 打断点看了一下,参数确实传递进去了,但走到 body 方法内部时,content 是空的(类型是State<Optional<String>>, _value = nil)。

Swift 复制代码
struct AView: View {
    @State private var content: String?
    var body: some View {
        Text(content ? "")
    }
    
    init(content: String) {
        self.content = content
    }
}

#Preview {
    AView(content: "Test")
}

网上查了一下,发现如果给 Viewinit 方法,需要用特殊的方式给 State 属性赋值。

Swift 复制代码
init(content: String) {
    _content = State(initialValue: content)
}

我理解被 @State 包装的属性类型已经变了(State<Type>)。我们在 View 的上下文中可以直接修改它,但是在初始化方法中不行。

不过当我们把 contentoptional 改成 非 optional 时,情况又变了。不需要使用特殊的方式,值一样可以通过 init 方法传递给 content 。。。

Swift 复制代码
struct AView: View {
    @State private var content: String
    var body: some View {
        Text(content)
    }
    
    init(content: String) {
        self.content = content
    }
}

#Preview {
    AView(content: "Test")
}

结论

一般我们不会主动去写 Viewinit 方法,不过当参数比较多且不是必要参数时,我们可能会重写 init 方法给参数默认值,以简化初始化方法。如果在之后的开发者遇到了参数无法传递问题,可以尝试使用 State 的构造方法来赋值。

相关推荐
zhyongrui19 小时前
SnipTrip 菜单 Liquid Glass 实现方案:结构、材质、交互与深浅色策略
ios·性能优化·swiftui·交互·开源软件·材质
zhyongrui19 小时前
SnipTrip 不发烫的实现路径:局部刷新 + 合成缓存 + 峰值削减
ios·swiftui
初级代码游戏1 天前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏2 天前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui2 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
zhyongrui3 天前
SnipTrip 发热优化实战:从 60Hz 到 30Hz 的性能之旅
ios·swiftui·swift
大熊猫侯佩3 天前
赛博深渊(上):用 Apple Foundation Models 提炼“禁忌知识”的求生指南
llm·swiftui·大语言模型·foundationmodel·apple ai·apple 人工智能·summarize
zhyongrui5 天前
SwiftUI 光晕动画性能优化:消除托盘缩放卡顿的实战方案
ios·性能优化·swiftui
大熊猫侯佩6 天前
星际穿越:SwiftUI 如何让 ForEach 遍历异构数据(Heterogeneous)集合
swiftui·swift·遍历·foreach·any·异构集合·heterogeneous
符哥20086 天前
对比ArkTsUI和Flutter和 SwiftUI 和Jetpack Compose四个框架语法及使用场景。
flutter·ios·swiftui