用 Xcode Playgrounds 做原型
Prototype with Xcode Playgrounds
2023年6月5日
一句话判断
Xcode 15 的 Playgrounds 有了内联结果展示和分屏预览,终于成了靠谱的原型工具。
这场 Session 讲了什么
Xcode Playgrounds 在 Xcode 15 中获得了多项改进,使其成为项目中原型开发的利器。Session 通过一个野生动物摄影 app 的实际案例展示了这些新功能。
项目中的 Playground 默认启用两个设置:Build Active Scheme 和 Import App Types。前者确保每次执行前构建活跃 scheme,后者自动导入 app target 模块。这让 Playground 可以直接使用项目中定义的类型。
Xcode 15 的新内联结果展示(Inline Result)是最大亮点。每行代码旁边直接显示结果,包括类型信息标签和详细信息的 tooltip。展开数组可以看到每个元素,自定义类型通过 CustomStringConvertible 提供更好的描述。新加入的 CustomPlaygroundDisplayConvertible 协议允许类型提供自定义的 Playground 展示方式。
自动运行模式让 Playground 在你停止输入后自动执行,实现真正的”修改即看到结果”的迭代体验。
值得深挖的点
CustomPlaygroundDisplayConvertible 协议是一个小巧但实用的功能。通过返回 playgroundDescription,你的自定义类型可以在 Playground 中展示更有意义的内容。比如一个包含照片的 Bird 类型,可以直接在分屏视图中展示照片缩略图,而不是仅仅显示类型名称。
Session 展示了一个实用的原型开发流程:先声明数据提供者,过滤出目标数据,逐步细化查询条件。每一步的结果都即时可见,帮助你在不重新构建和运行 app 的情况下验证逻辑。
代码片段
// 在 Playground 中使用项目类型
import AppModule
let birdProvider = BirdProvider(region: .northAmerica)
// 内联结果直接显示 BirdProvider 实例详情
let birdsToFind = birdProvider.birds.filter { $0.photo == nil }
// 结果显示还有多少鸟没拍到
// 为自定义类型添加描述
extension Bird: CustomStringConvertible {
var description: String {
"\(commonName) (\(scientificName))"
}
}
// 自定义 Playground 展示
extension Bird: CustomPlaygroundDisplayConvertible {
var playgroundDescription: Any {
photo as Any // 直接展示照片
}
}
最佳实践
- 使用自动运行模式实现快速迭代
- 为自定义类型实现
CustomStringConvertible,提供有意义的描述 - 利用
CustomPlaygroundDisplayConvertible展示富媒体内容 - 在 Sources 目录中添加只影响 Playground 的扩展
- 在 app 源文件中添加通用扩展(如 description)
还有什么值得关注
- Playground 的内联结果支持点击查看详情的分屏视图
- 多表达式同行时,点击控制按钮切换查看各表达式结果
- Xcode 15 的 tooltip 显示类型的详细信息
- Playground 是开发测试用例的好起点