如果预览内容文件夹中有 SwiftUI 预览的代码,为什么存档会失败?

Jer*_*emy 27 xcode swift swiftui

在我的 SwiftUI 应用程序中,我将一些示例模型对象放在 Xcode 的“预览内容”文件夹中。我只在我的 SwiftUI 中访问它们PreviewProvider。我的理解是这个文件夹中的代码/资产仅用于在Canvas中进行预览。我的预览工作正常。我正在使用 Xcode 11.6 (11E708)。

但是,当我去存档我的应​​用程序时,它失败了,因为它找不到这些示例模型对象。我的印象PreviewProvider是,从 Xcode 11 开始,代码并未构建到最终二进制文件中。请参阅Xcode 11 发行说明中的此问题此屏幕截图

(奇怪的是,我能够使用 Release 配置进行编译。只是 Archive 失败了。)

作为一种解决方法,我可以将#if DEBUG/#endif包装器放在我PreviewProvider的周围,但上面的屏幕截图表明这不是必需的。

我是否误解了“预览内容”文件夹的工作原理?

Jer*_*emy 3

编辑:没关系,这种方法“有效”,但预览代码仍在最终存档中,因此它实际上没有任何帮助。

我将所有预览测试数据放在自己的“PreviewProvider”中,以便我可以在其他预览中访问它。存档仍然成功,测试数据将在最终存档中被删除。不需要`#if DEBUG`。

示例(特定于我自己的用例):

struct PreviewData: PreviewProvider {
    static var previews: some View {
        Text("This is test data for use in other previews.")
    }

    // Use enums for namespacing if desired
    enum Choices {
        static let deals = Choice(id: UUID().uuidString, text: "I want the best deals.", iconName: "bestDealsIcon")
        static let technology = Choice(id: UUID().uuidString, text: "I love technology!", iconName: "technologyIcon")
    }
Run Code Online (Sandbox Code Playgroud)

然后我就可以PreviewData.Choices.deals在其他PreviewProviders中访问了。

  • 没关系 - 我意识到这个测试数据*没有*从最终存档中删除。我尝试在我的正常视图(不是预览)中使用其中的一些,并且它可以工作,但它不应该。 (2认同)