国内顶级 AI 的回答令人“贻笑大方”:看来苹果秃头码农们暂时还不会失业吧?

概览

在苹果 App 的日常开发中,利用 Xcode 预览可以帮我们极大的提高界面调试的效率。而且,若能进一步判断出当前 App 是否运行在 Preview 环境中则会更让秃头码农们"笑逐颜开"。

那么到底有没有简单的方法来完成这一任务呢?答案是肯定的!

在本篇博文中,您将学到如下内容:

  1. 从 AI 回答引发的"惨案"聊起
  2. 检查是否在 Preview 中运行的正确方法
  3. 侠肝义胆:SwiftUI 6.0 的 @Entry 宏前来助战!

相信学完本篇后,小伙伴们一定会惊叹:原来利用 SwiftUI 6.0(iOS 18)中的 @Entry 宏,识别 App 当前是否在预览中运行是如此的干脆利落、手到擒来!

那还等什么呢?让我马上开始 Preview 之旅吧!

Let's go!!!;)


1. 从 AI 回答引发的"惨案"聊起

最近,我恰好需要回顾一下判断当前应用是否在 Xcode 预览中运行的方法,其实对于这个问题的答案很久之前我就已然知晓了。

不过,我还是决定让目前很火的 AI 来回答一下它:

虽然我手误将 SwiftUI写成了 SwiftData,但"机智的" AI 仍然秒懂了我的真正意图而且给出了貌似"精彩"解答:

在SwiftUI中,可以通过@Environment(.isPreview)来判断应用是否在预览中运行。以下是一个简单的示例代码:

swift 复制代码
import SwiftUI

struct ContentView: View {
    @Environment(\.isPreview) var isPreview

    var body: some View {
        Text(isPreview ? "在预览中" : "不在预览中")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

人工智能最后还"信誓旦旦"的总结到:

在这个例子中,ContentView会根据它是否在预览中运行来显示不同的文本。@Environment(.isPreview)会注入一个布尔值,指示当前的视图是否在Xcode预览canvas中展示。

在苹果开发新手看来,这不得不说是一个"简洁而漂亮,飘逸又潇洒"的解答。

我不知道这个号称"全球领先"的 AI 是从何处得来的这个答案,可惜的是,实际上这个答案纯属"胡说九道",无稽之谈!

因为在 SwiftUI 内置的 Environment 变量中根本没有 isPreview 这个所谓的值!

2. 检查是否在 Preview 中运行的正确方法

检查应用当前是否在 Xcode 预览中运行很简单,只需一个仅包含一行代码的计算属性即可:

swift 复制代码
extension ProcessInfo {
    public var isRunningInPreviews: Bool {
        environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
    }
}

我们可以这么使用 isRunningInPreviews 属性:

swift 复制代码
extension ModelContainer {
    
    private static let schema = Schema([
        //...
    ])
    
    static var shared: ModelContainer = {
        
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)

        return try! ModelContainer(for: schema, configurations: [modelConfiguration])
    }()

    static var preview: ModelContainer = {
        
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true)

        return try! ModelContainer(for: schema, configurations: [modelConfiguration])
    }()

    static var used: ModelContainer = {
        ProcessInfo.processInfo.isRunningInPreviews ? .preview : .shared
    }()
}

如上代码所示:只要直接使用 ModelContainer.used 模型容器实例对象,我们即可以满足 App 在正常和预览环境中两种不同使用场景的需求。

3. 侠肝义胆:SwiftUI 6.0 的 @Entry 宏前来助战!

虽然我们已经完全解决了博文开头那个问题,但是到这里还不算完。

利用 SwiftUI 6.0 中新加入的 @Entry 宏,我们可以"将错就错":让之前 AI 那个"似是而非"的答案"逆天改命"成为"天选之子"。


关于 WWDC 24 中 @Entry 宏进一步相关的介绍,请小伙伴们移步如下链接观赏精彩内容:


首先,在 EnvironmentValues 中用 @Entry 宏添加一个 isPreviewing 值:

swift 复制代码
extension EnvironmentValues {
    @Entry var isPreviewing = ProcessInfo.processInfo.isRunningInPreviews
}

接着,我们可以在任意 SwiftUI 视图中使用 isPreviewing 环境变量啦:

swift 复制代码
struct ContentView: View {
    
    @Environment(\.isPreviewing) var isPreviewing
    
    var body: some View {
        NavigationStack {
            Text("是否在预览中运行:\(isPreviewing ? "是" : "否")")
        }
    }
}

现在,不同运行环境中的 App 便可以非常轻松方便的判断出当前是否在 Xcode 预览中运行啦!棒棒哒!💯

总结

在本篇博文中,我们先是了解到国内某个顶级 AI 对于苹果 SwiftUI 开发中的简单问题,竟然给出一个"啼笑皆非"的答案。随后,我们用 SwiftUI 6.0(iOS 18)中全新的 @Entry 宏让问题真正的迎刃而解。

感谢观赏,再会啦!8-)

相关推荐
mCell2 小时前
10分钟复刻爆火「死了么」App:vibe coding 实战(Expo+Supabase+MCP)
react native·ai编程·vibecoding
jacky2576 小时前
衍射光波导与阵列光波导技术方案研究
aigc·ar·xr·ai编程·仿真·混合现实·光学设计
人工智能训练8 小时前
UE5 如何显示蓝图运行流程
人工智能·ue5·ai编程·数字人·蓝图
deephub9 小时前
构建自己的AI编程助手:基于RAG的上下文感知实现方案
人工智能·机器学习·ai编程·rag·ai编程助手
猪猪拆迁队9 小时前
2025年终总结-都在喊前端已死,这一年我的焦虑、挣扎与重组:AI 时代如何摆正自己的位置
前端·后端·ai编程
wangruofeng12 小时前
OpenCode 上手初体验:从安装到基础使用
github·ai编程
饼干哥哥12 小时前
1 个人用AI编程开发的产品卖了8000万美金——Base44的增长策略全拆解
人工智能·ai编程
aou12 小时前
让表格式录入像 Excel 一样顺滑
前端·ai编程
特别橙的橙汁12 小时前
Node.js 调用可执行文件时的 stdout 缓冲区问题
前端·node.js·swift
去哪儿技术沙龙13 小时前
去哪儿网前端代码自动生成技术实践
前端·ai编程