原始值可表达:让枚举安全映射外来数据而不崩溃
RawRepresentable 自动合成?探讨自定义 RawRepresentable 实现容错解析:当原始值无效时返回 nil 而非崩溃,并利用可选绑定优雅降级。 · 难度:入门 · +10XP
容错原始值映射
标准库的 RawRepresentable 在 init?(rawValue:) 中如果枚举没有对应的 case 会返回 nil。但很多人直接使用强制解包导致崩溃。本教程展示如何为来自 JSON 或数据库的整型/字符串编写安全的初始化器,并利用 Result 类型返回错误上下文。
enum Status: String {
case active, inactive, pending
}
extension Status {
init(safeRawValue: String) -> Result<Status, Error> {
if let status = Status(rawValue: safeRawValue) {
return .success(status)
} else {
return .failure(StatusError.unknownValue(safeRawValue))
}
}
}
let result = Status(safeRawValue: "deleted")
// .failure(StatusError.unknownValue("deleted"))