Swift枚举如何支持空值?传入空枚举值报错的解决方案
解决Swift枚举无法传入空值/自定义新类型的问题
这个问题我碰到过,核心原因是你当前的SupportType是固定值枚举,只认可type1/type2/type3这三个rawValue,空字符串不在预定义范围内,所以SupportType(rawValue: "")会返回nil,直接传入非可选的SupportType类型参数自然会触发空值错误。
要实现“不使用现有枚举值声明新类型”的需求,有两种常用方案,你可以根据实际场景选择:
方案1:扩展枚举支持自定义值(推荐)
给枚举新增一个带关联值的custom case,用来处理所有预定义之外的情况(包括空字符串),同时手动实现RawRepresentable和Codable的逻辑(因为带关联值的枚举不能直接用String作为原始类型):
enum SupportType: Codable { case type1 case type2 case type3 case custom(String) // 新增支持自定义字符串的case // 自定义rawValue的获取逻辑 var rawValue: String { switch self { case .type1: return "type1" case .type2: return "type2" case .type3: return "type3" case .custom(let str): return str } } // 自定义rawValue初始化逻辑 init(rawValue: String) { switch rawValue { case "type1": self = .type1 case "type2": self = .type2 case "type3": self = .type3 default: self = .custom(rawValue) // 所有不匹配的都归为custom,包括空字符串 } } func string() -> String { switch self { case .type1: return "Type 1" case .type2: return "Type 2" case .type3: return "Type 3" case .custom(let str): return str.isEmpty ? "Empty Type" : str // 空字符串可以自定义显示文本 } } }
修改后,你就可以直接传入空字符串创建自定义类型了:
// 两种方式都可以 let newType = NewType(name: data.name, supportType: [SupportType(rawValue: "")], supportName: "") // 或者直接用case初始化 let newType = NewType(name: data.name, supportType: [.custom("")], supportName: "")
方案2:将属性改为可选类型(仅适用于允许“无类型”的场景)
如果你的需求只是允许supportType为空,而不是创建新的自定义类型,可以把类中的属性声明改为可选类型:
// 修改类中的属性 var supportType: SupportType?
然后创建对象时直接传入nil:
let newType = NewType(name: data.name, supportType: nil, supportName: "")
不过这个方案只是允许空值,并没有真正创建“新类型”,所以更推荐方案1来满足你的核心需求。
内容的提问来源于stack exchange,提问作者user616076
相关产品推荐
相关产品推荐

