渐进式编程课
SwiftUI 目录
第 18 课2026.09.24

场景存储中的路径数据无法解码时,避免每次显示页面都重复尝试同一损坏值。

第 18 课:损坏的导航数据回退到根页

  • 日期:2026-09-24
  • 课程序号:第 18 课
  • 知识点:恢复失败时清理无效场景数据

用途或适用场景

场景存储中的路径数据无法解码时,避免每次显示页面都重复尝试同一损坏值。

核心概念

解码失败后清除 savedPath 并保持根路径;可恢复数据仍只由 @SceneStorage 保存,当前导航仍由 path 持有。

最小代码或操作示例

swift
// 替换第 17 课 LessonView 中的 restorePath(),其余代码不变。
private func restorePath() {
    guard let savedPath else { return }
    do {
        let value = try JSONDecoder().decode(
            NavigationPath.CodableRepresentation.self, from: savedPath
        )
        path = NavigationPath(value)
    } catch {
        self.savedPath = nil
        path = NavigationPath()
    }
}

3~5 分钟练习

暂把 savedPath 设成无法解码的 Data([0]),再调用恢复方法。

参考答案

解码失败后 savedPath 被清空,path 为空,界面回到根页;下一次打开不会重复使用坏数据。

与上一课的联系

沿用第 17 课的自动保存、savedPath 和 restorePath();本课只新增解码失败时的明确清理分支;完成后下一课可为清理动作增加可观测日志。

时效校验

时效校验:2026-09-24(Apple 当前 NavigationPath 与 SceneStorage 官方 API;组合示例沿用上一课最低 iOS 17 / macOS 14,未见废弃标记)。

官方参考