Swan's Quest, Chapter 4: The sequence completes
Developer Tools 入门 8m

天鹅任务第四章:序列完成

Swan's Quest, Chapter 4: The sequence completes

2020年6月25日

在 Apple 官方观看视频

一句话判断

Swan’s Quest 最终章把前三章的音频检测、音调生成和图形绘制全部串联起来——你需要编解码一个序列来完成最终挑战,是一场综合考验 iOS 开发基础能力的编程冒险。

这场 Session 讲了什么

第四章是 Swan’s Quest 的最终章,需要综合运用前三章学到的技能来完成终极挑战。

这一章的核心编程任务涉及序列化(Serialization)和数据编解码:你需要把前三章收集到的信息(频率、图形、数据)编码成一个特定的序列格式,然后解码并执行正确的操作来完成冒险。

编程层面,你需要理解 Codable 协议、JSONEncoder/JSONDecoder 的使用、以及如何把不同类型的数据(音频频率、图形路径、字符串)统一序列化和反序列化。

完成全部四章后,玩家会获得一个「完成徽章」和来自虚拟角色的祝贺信息。整个体验设计得很像 RPG 游戏,但每个「关卡」的解决方案都是一段真实的 iOS 代码。

值得深挖的点

Codable 在实际场景中的应用

这一章让你在游戏中自然地学习 Codable。你需要定义数据结构来表示各种线索,用 JSONEncoder 把它们编码为字符串,再用 JSONDecoder 解码回来。这比看文档学 Codable 有效得多——你有一个明确的「把数据从 A 传到 B」的目标。

代码片段

import Foundation

// 定义 Swan's Quest 的线索数据结构
struct QuestClue: Codable {
    let chapter: Int
    let frequency: Double?
    let symbol: String?
    let timestamp: Date
}

struct QuestSequence: Codable {
    let clues: [QuestClue]
    let finalCode: String
}

// 编码序列
func encodeSequence() {
    let sequence = QuestSequence(
        clues: [
            QuestClue(chapter: 1, frequency: 440.0, symbol: nil, timestamp: Date()),
            QuestClue(chapter: 2, frequency: 880.0, symbol: nil, timestamp: Date()),
            QuestClue(chapter: 3, frequency: nil, symbol: "star", timestamp: Date())
        ],
        finalCode: "SWAN2020"
    )
    
    let encoder = JSONEncoder()
    encoder.dateEncodingStrategy = .iso8601
    
    if let data = try? encoder.encode(sequence),
       let jsonString = String(data: data, encoding: .utf8) {
        print("编码结果: \(jsonString)")
    }
}

// 解码序列
func decodeSequence(from jsonString: String) {
    guard let data = jsonString.data(using: .utf8) else { return }
    
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .iso8601
    
    if let sequence = try? decoder.decode(QuestSequence.self, from: data) {
        for clue in sequence.clues {
            print("第 \(clue.chapter) 章线索:")
            if let freq = clue.frequency {
                print("  频率: \(freq) Hz")
            }
            if let symbol = clue.symbol {
                print("  符号: \(symbol)")
            }
        }
    }
}

最佳实践

  1. 先通读所有提示再动手。第四章的线索分散在前三章的完成结果中,先回顾一下你之前收集了什么。
  2. 不要跳过前三章直接做第四章。虽然技术上可行,但你缺少上下文,解谜的乐趣会大打折扣。

还有什么值得关注

  • 完成全部四章后,Swift Playgrounds 会显示你的完成证书和统计数据。
  • 苹果在 WWDC 2020 期间为完成 Swan’s Quest 的开发者准备了限量版成就徽章。
  • 这个编程挑战的设计模式(交互式教程 + 解谜)是苹果教育团队的招牌手法,后续年份的 WWDC 也有类似活动。
WWDC 2020