为 iPad 和 Mac 创建 Swift Playgrounds 内容
Create Swift Playgrounds content for iPad and Mac
2020年6月25日
一句话判断
Swift Playgrounds 4 现在支持创建自定义教学包了——你可以设计交互式编程课程、嵌入提示和验证逻辑,用 Swift Package 的格式打包分发,适合教育场景和团队内部分享知识。
这场 Session 讲了什么
Swift Playgrounds 一直以来是苹果官方的 Swift 学习工具,内置了「Learn to Code」系列课程。iOS 14 / macOS Big Sur 上的 Swift Playgrounds 新增了「创建自定义 Playground Book」的能力,让开发者可以设计自己的交互式教学内容。
Session 讲解了 Playground Book 的文件结构(基于 Swift Package)、如何编写教学页面(Page)、如何添加 hint(代码提示)和 success criteria(完成验证)、以及如何在页面间组织学习路径。自定义内容可以通过 AirDrop、邮件、或者托管在网站上分发。
重点介绍了 Playground Book 的 manifest 文件格式、Chapters 和 Pages 的层级关系、以及如何使用 UserTest 框架编写自动验证逻辑来判断学习者的代码是否正确。
值得深挖的点
Playground Book 的结构设计
一个 Playground Book 由 Chapters 组成,每个 Chapter 包含多个 Pages。每个 Page 是一个独立的 Swift 源文件加上一个 manifest.plist。Page 可以设置为「编辑模式」(用户需要修改代码)或「只读模式」(展示用)。通过 UserTests 目录下放置测试代码,可以自动验证用户提交的答案。
Hint 系统的教学设计
Hint 不是一个简单的文本提示,而是分级的:第一个 hint 只给方向性提示,第二个给更具体的指导,第三个可能直接给出关键代码片段。Session 建议设计三个级别的 hint,让学习者在逐步引导下自己找到答案,而不是一上来就给答案。
代码片段
// Page 的 manifest.plist 示例配置
// 放在 Page 目录下
/*
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LiveViewMode</key>
<string>visible</string> <!-- 显示实时预览 -->
<key>PlaygroundLoggingLevel</key>
<string>minimal</string>
<key>Version</key>
<string>1.0</string>
<key>UserAutoImport</key>
<array>
<string>UIKit</string>
</array>
</dict>
</plist>
*/
// 用户需要完成的代码模板(放在 Contents.swift)
// 任务:实现一个函数,将数组中的偶数过滤出来
func filterEven(numbers: [Int]) -> [Int] {
// 在这里写下你的代码
//#-editable-code
return []
//#-end-editable-code
}
// 测试验证
let testInput = [1, 2, 3, 4, 5, 6, 7, 8]
let result = filterEven(numbers: testInput)
print("偶数有: \(result)")
// UserTests 目录下的验证代码
// 框架会自动运行这些测试来判断用户是否完成
import XCTest
class FilterEvenTests: XCTestCase {
func testBasicFilter() {
let result = filterEven(numbers: [1, 2, 3, 4, 5, 6])
XCTAssertEqual(result, [2, 4, 6], "应该返回所有偶数")
}
func testEmptyInput() {
let result = filterEven(numbers: [])
XCTAssertEqual(result, [], "空输入应该返回空数组")
}
func testNoEvens() {
let result = filterEven(numbers: [1, 3, 5, 7])
XCTAssertEqual(result, [], "没有偶数时应该返回空数组")
}
}
最佳实践
- 教学页面要短小精悍。每个 Page 聚焦一个知识点,代码量控制在 20 行以内。不要在一个 Page 里塞三个概念。
- hint 设计要分层递进。Level 1 给概念提示,Level 2 给伪代码级别提示,Level 3 给关键代码片段。让学习者在得到答案前至少思考过一次。
- 用
UserTest做全面的边界测试。只测 happy path 不够,要考虑空输入、极端值、错误输入。这样能防止学习者「凑答案」通过测试。
还有什么值得关注
- Playground Book 支持 Live View,可以在右侧面板实时展示 UIKit/SwiftUI 的渲染结果,适合教 UI 开发。
- Swift Playgrounds 现在可以在 Mac(Apple silicon)上运行,分发给 macOS 用户时不需要额外适配。
- 苹果提供了 Playground Book 模板项目,在 Xcode 中新建即可,不用手动搭建文件结构。