Shallows容错机制详解:fallback与defaulting让Swift缓存永不崩溃
Shallows容错机制详解fallback与defaulting让Swift缓存永不崩溃【免费下载链接】Shallows Your lightweight persistence toolbox项目地址: https://gitcode.com/gh_mirrors/sh/ShallowsShallows 是面向 Swift 的轻量级持久化工具箱Your lightweight persistence toolbox核心类型StorageKey, Value让你可以像搭积木一样组合内存缓存、磁盘缓存等各类存储。而它的容错机制——fallback(with:)与defaulting(to:)——正是让 Swift 缓存永不崩溃的关键任何一次读取失败都会被自动降级为兜底值业务代码不再需要到处写错误分支。一、为什么 Swift 缓存的读取出错是常态在 Shallows 中每一次读取和写入都是可失败操作回调里返回的是Result类型storage.retrieve(forKey: some-key) { result in switch result { case .success(let value): print(value) case .failure(let error): print(error) } }失败的场景非常常见 内存存储里没有这个 keyMemoryStorage会返回MemoryStorageError.noValue定义见Sources/Shallows/MemoryStorage.swift第 41 行 磁盘读写失败DiskStorage.Error定义了cantCreateFile、cantCreateDirectory等错误见Sources/Shallows/DiskStorage/DiskStorage.swift第 115–118 行如果每个调用点都要处理这些错误代码会很快变得繁琐。Shallows 的解决方案是给存储套一层保护壳出错时自动返回预设的兜底值。二、fallback(with:) 用法为缓存读取设置降级出口fallback(with:)接收一个错误 → 值的闭包定义见Sources/Shallows/Storage.swift第 153–156 行。当底层读取失败时这个闭包会被调用用它产出的值作为成功结果返回let storage MemoryStorageString, Int() let protected storage.fallback(with: { error in switch error { case MemoryStorageError.noValue: return 15 // 没存过返回 15 default: return -1 // 其他错误返回 -1 } }) 闭包能拿到具体的错误对象所以你可以针对不同错误返回不同的降级值——这是defaulting做不到的精细控制。三、defaulting(to:) 用法一行代码搞定默认值兜底如果不管什么错误都返回同一个默认值用defaulting(to:)更简洁Sources/Shallows/Storage.swift第 158–160 行let defaulted storage.defaulting(to: -1)它本质是fallback的语法糖——内部直接调用fallback(with: { _ in defaultValue() })。参数使用了autoclosure意味着默认值只在真正发生错误时才会求值不会白白消耗性能。对比项fallback(with:)defaulting(to:)能否区分错误类型✅ 可以❌ 一律返回同一默认值代码量需写错误处理闭包一行默认值求值时机出错时出错时惰性求值四、黄金组合defaulting update让累加器永不失败官方 READMEREADME.md第 198–226 行 Recovering from errors 章节给出了最经典的用法let storage MemoryStorageString, [Int]() storage.defaulting(to: []).update(forKey: first) { $0.append(10) }原理update本质是先读、再改、后写。没有兜底时首次调用因 key 不存在而读取失败整个 update 直接失败加上defaulting(to: [])后读取失败会降级为空数组[]累加操作照常完成。缓存不存在 ≠ 业务失败——这正是永不崩溃的核心思想。五、机制细节fallback 只保护读取不拦截写入阅读Sources/Shallows/Storage.swift第 153–156 行的源码可以发现public func fallback(with produceValue: escaping (Error) throws - Value) - StorageKey, Value { let readOnly asReadOnlyStorage().fallback(with: produceValue) return Storage(read: readOnly, write: asWriteOnlyStorage()) }三个关键细节值得注意️只包裹读取链路写入部分原样保留写入错误仍会照常上报不会被掩盖。⚠️降级本身也可能失败如果闭包抛出异常错误会原样向上传递见Sources/Shallows/ReadOnlyStorage.swift第 103–119 行的switch分支不会静默吞掉。可与组合缓存叠加先combined(with:)再套fallback——内存未命中 → 查磁盘 → 磁盘也失败最后由 fallback 兜底层层设防。六、实战建议如何选择合适的容错方式选型清单设置项、配置类数据几乎必须成功→ 用defaulting(to:)一行搞定需要按错误类型降级区分未找到与文件损坏→ 用fallback(with:)配合 update 做累加、合并操作→ 永远加上defaulting(to:)关键写入路径→ 不要用 fallback 掩盖错误让失败显式上报配合日志与重试结语Shallows 的容错机制设计得非常克制fallback(with:)提供精细的错误降级defaulting(to:)提供简洁的默认值兜底两者都以组合的方式挂在任意存储之上无需侵入底层实现。掌握了这套机制你的 Swift 缓存将不再惧怕数据不存在和IO 偶发失败——读取永远有值返回应用自然永不崩溃。【免费下载链接】Shallows Your lightweight persistence toolbox项目地址: https://gitcode.com/gh_mirrors/sh/Shallows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考