SwiftUI PreviewProvider中如何为可选Void类型函数传nil或占位函数?
解决方案
1. 允许传递nil的正确方式
你的Toolbar中closeThisView的类型是() -> Void?(返回可选Void的函数),并非可选的函数类型,所以直接传nil会报错。如果需要支持传递nil,请修改参数定义为可选函数类型:
struct Toolbar: View { // 改为可选函数类型:(() -> Void)? let closeThisView: (() -> Void)? var toolbarTitle: String var body: some View { Text("bla") } }
修改后,预览里就能直接传nil了:
struct Toolbar_Previews: PreviewProvider { static var previews: some View { Toolbar(closeThisView: nil, toolbarTitle: "comments") .preferredColorScheme(.dark) } }
2. 不修改Toolbar定义,传递空函数
如果不想修改Toolbar的参数类型,只需传递一个符合() -> Void?类型的空函数即可,比如返回nil或空的可选Void:
struct Toolbar_Previews: PreviewProvider { static var previews: some View { // 方式1:返回nil的闭包 Toolbar(closeThisView: { nil }, toolbarTitle: "comments") // 方式2:返回空可选Void的闭包 // Toolbar(closeThisView: { () }, toolbarTitle: "comments") .preferredColorScheme(.dark) } }
3. 你的第二个写法的问题
你尝试的预览代码存在两个问题:
PreviewProvider的previews是静态方法,无法访问实例方法closeThisView@Environment(\.dismiss)只能在View结构体中使用,PreviewProvider不是View,无法获取该环境值
如果想在预览中传递一个实际有逻辑的函数(虽然预览不会执行),可以直接在闭包里写空逻辑:
struct Toolbar_Previews: PreviewProvider { static var previews: some View { Toolbar(closeThisView: { // 空逻辑,预览不会执行 print("关闭视图") return nil }, toolbarTitle: "comments") .preferredColorScheme(.dark) } }
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

