Latest
Claude Code|使用 CLAUDE.md 添加规则
CLAUDE.md 是一个特殊文件,Claude 在开始对话时会自动将其纳入上下文。类似于 Cursor 中的 Rules。
CLAUDE.md 文件没有固定格式要求,应当保持内容简洁且易于阅读。
# Bash 命令
- npm run build:构建项目
- npm run typecheck:运行类型检查器
# 代码风格
- 使用 ES 模块(import/export)语法,避免使用 CommonJS(require)
- 尽可能使用解构导入(例如:import { foo } from 'bar')
# 工作流程
- 完成一系列代码更改后务必运行类型检查
- 为了性能,
MVVM 架构|协调 Service 层与Manager 层
在使用 MVVM 架构的 Swift 项目,可以抽象出 MVVM 核心层和支持层。
* 核心层包含基本的 Model、View 和 ViewModel。
* 支持层包含 Service、Manager 和其他工具类(Utilities)。
一个完整的项目结构是这样:
在涉及 SwiftData 的功能模块,会更复杂一些。
Manager 和 Service 的协调关系
Service > Manager
典型的调用链路:
View → ViewModel → Service → Manager → 外部资源
Service 层级高于 Manager,在 Service 调用多个 Manager。
在 ViewModel 中调用 Service
* 避免在 View 中直接调用
Concurrency|Swift 6.2 让并发更容易控制
Swift Concurrency 实际上包含异步和并发两个部分,他们是不同的概念:
* 异步:async/await 语法,让代码不阻塞当前线程,后续代码可以继续执行。
* 并发:使用 Task 与 Actor 等并发原语,控制任务在哪个线程执行。
以下是关于 Swift Concurrency 的几个核心:
1 - 使用异步,并不意味着一定在后台线程执行
实际上,在大部分情况下,任务仍然在调用它的线程中执行 —— 这避免了数据竞争的问题,但仍然可能运行卡顿。
对于耗时但轻量级的任务,使用异步能很好的解决卡顿问题,最常见的场景是处理网络请求。然而,对于一些非常消耗性能的繁重任务,如果在主线程执行,即使使用异步语法,也会导致运行卡顿 —— 因为主线程资源可能被耗尽。
2 - 可以使用 Task 控制任务执行的线程
理想情况下,对于繁重的任务,应当将它从主线程剥离分派到后台线程执行,从而保证 App 界面运行流程
Next.js|使用 Vercel 开始一个 Web 项目
了解如何使用 Vercel 开始一个 Nextjs + React 技术栈的 Web 项目,并在 Cursor 中继续开发。
macOS | 导出用于发布的 DMG 文件
了解如何在 Xcode 上导出并打包用于发行的 DMG 压缩文件。
macOS|常用 SwiftUI 修饰器
menuIndicator:隐藏菜单指示器
macOS 系统中,导航栏的 Menu 组件右侧会自动显示向下箭头:
可以使用 .menuIndicator() 修饰器隐藏它: