在SwiftUI的navigationDestination中,将item转换为Binding的最佳方式是什么?
嘿,我看你现在是手动写get和set闭包来构建Binding,其实SwiftUI里有更简洁的方式来处理这种场景,而且代码会更清爽!
首先明确一个关键前提:当navigationDestination(item: $selectedProject)的闭包被触发时,selectedProject肯定是非nil的——毕竟只有当这个可选值有内容时,导航才会被触发,所以我们可以利用这个安全的上下文来简化代码。
给你几个更优的写法:
方式一:直接使用可选Binding的强制解包(简洁且安全)
因为此时$selectedProject的包装值一定存在,所以强制解包是绝对安全的,代码瞬间精简很多:
.navigationDestination(item: $selectedProject) { _ in ProjectView(project: $selectedProject!) }
方式二:利用Binding.nonNil属性(iOS 15+)
如果你不太喜欢写感叹号,也可以用SwiftUI自带的nonNil属性,把Binding<Project?>转换成Binding<Project>?,再进行强制解包(同样安全):
.navigationDestination(item: $selectedProject) { _ in ProjectView(project: $selectedProject.nonNil!) }
要是你追求代码风格更严谨,也可以用guard let包裹(虽然这里的错误分支永远不会执行,但看起来更稳妥):
.navigationDestination(item: $selectedProject) { _ in guard let projectBinding = $selectedProject.nonNil else { Text("无效的项目") return } ProjectView(project: projectBinding) }
额外小建议
如果你的ProjectView可以接受Binding<Project?>类型的参数,那直接传$selectedProject就完事了,连转换步骤都省了!只需要把ProjectView的参数类型改成Binding<Project?>,内部处理好可选值的逻辑就行。
你当前手动构建Binding的写法是完全有效的,但上面这些方式更贴合SwiftUI的设计思路,减少了冗余的闭包代码,可读性也更强。
内容来源于stack exchange
相关产品推荐
相关产品推荐

