当前位置: 首页 > news >正文

国内顶级 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)来判断应用是否在预览中运行。以下是一个简单的示例代码:

import SwiftUIstruct ContentView: View {@Environment(\.isPreview) var isPreviewvar 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 预览中运行很简单,只需一个仅包含一行代码的计算属性即可:

extension ProcessInfo {public var isRunningInPreviews: Bool {environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"}
}

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

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 宏进一步相关的介绍,请小伙伴们移步如下链接观赏精彩内容:

  • SwiftUI 6.0(Xcode 16)全新 @Entry 和 @Previewable 宏让开发妙趣横生

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

extension EnvironmentValues {@Entry var isPreviewing = ProcessInfo.processInfo.isRunningInPreviews
}

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

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

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

在这里插入图片描述
在这里插入图片描述

总结

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

感谢观赏,再会啦!😎

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue3+vite全局引入less变量和函数
  • playwrite今日头条自动发帖
  • 未授权访问漏洞
  • 对于泛型以及泛型擦除的理解
  • Ubuntu防火墙相关命令
  • 【轨物推荐】什么是科学?什么是技术?
  • 仓库管理系统(WMS)是什么?如何用手机RFID+扫码技术管理仓库?
  • 将本地微服务发布到docker镜像
  • vm虚拟机下安装CentOS7系统
  • 力扣第45题:跳跃游戏 贪心DP(C++)
  • 哈佛大学单细胞课程|笔记汇总 (二)
  • Jenkins保姆笔记(1)——基于Java8的Jenkins安装部署
  • 使用Cisco进行模拟RIP路由协议配置
  • 文献解读-肿瘤测序-第二十七期|《敲减通过控制TOP2A下调的NUSAP1可以抑制人胶质母细胞瘤的细胞增殖和侵袭》
  • Prometheus 笔记
  • bearychat的java client
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • javascript 总结(常用工具类的封装)
  • JavaScript异步流程控制的前世今生
  • Laravel核心解读--Facades
  • Node 版本管理
  • Node项目之评分系统(二)- 数据库设计
  • Solarized Scheme
  • Vue2.0 实现互斥
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 产品三维模型在线预览
  • 复习Javascript专题(四):js中的深浅拷贝
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 入口文件开始,分析Vue源码实现
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 微信小程序:实现悬浮返回和分享按钮
  • 温故知新之javascript面向对象
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Spring-boot高级
  • (07)Hive——窗口函数详解
  • (1) caustics\
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Java入门)学生管理系统
  • (笔记)M1使用hombrew安装qemu
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (六)c52学习之旅-独立按键
  • (六)DockerCompose安装与配置
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十一)手动添加用户和文件的特殊权限
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)基于IDEA的JAVA基础10
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转载)从 Java 代码到 Java 堆
  • (总结)Linux下的暴力密码在线破解工具Hydra详解