可用性检查通过嵌套对象声明打破预览宏

问题描述 投票:0回答:1

如果您要将

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

有没有其他选择,而不是依赖第一个代码片段中显示的外部对象声明?

swift swiftui macros preview
1个回答
0
投票

我发现的解决方法是检查预览关闭中的

#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()
}
© www.soinside.com 2019 - 2024. All rights reserved.