如果您要将
State
属性与新的 Preview
宏一起使用,则必须为其创建一个包装器:
#Preview(body: {
Preview()
})
private struct Preview: View {
@State private var isOn: Bool = true
var body: some View {
Toggle(
isOn: $isOn,
label: EmptyView.init
)
.labelsHidden()
}
}
这不仅会使代码库变得混乱,而且还迫使您使用任意名称,以防每个文件有多个预览。
这就是为什么,对象声明可以直接嵌套在宏中:
#Preview(body: {
struct Preview: View {
@State private var isOn: Bool = true
var body: some View {
Toggle(
isOn: $isOn,
label: EmptyView.init
)
.labelsHidden()
}
}
return Preview()
})
但是,当我们向宏附加可用性属性时,宏会出现编译问题 —
@available(iOS 17.0, *)
#Preview(body: {
struct Preview: View {
@State private var isOn: Bool = true
var body: some View {
Toggle(
isOn: $isOn,
label: EmptyView.init
)
.labelsHidden()
}
}
return Preview()
})
——这很奇怪,因为带有可用性检查的简单预览编译得很好:
@available(iOS 17.0, *)
#Preview(body: {
Text("Hello World")
})
编译器抛出以下错误:
Compiling failed: 'Preview' is only available in iOS 17.0 or newer
。
有没有其他选择,而不是依赖第一个代码片段中显示的外部对象声明?
我发现的解决方法是检查预览关闭中的
#available
内部:
#Preview {
guard #available(iOS 17.0, *) else { return EmptyView() }
struct Preview: View {
@State private var isOn: Bool = true
var body: some View {
...
}
}
return Preview()
}