Swift中如何创建case与值一一对应的枚举(无需value属性)
问题描述
我希望创建一个枚举,让枚举case直接对应指定值,例如Apple.good == "I am good"、Apple.bad == "I am bad"。示例代码2可实现该需求,但能否不使用value属性来达成?
代码1
enum Apple { case good case bad } let a = Apple.good // I am good print(a)
代码2
enum Apple { case good case bad var value: String { switch self { case .good: return "I am good" case .bad: return "I am bad" } } } let a = Apple.good.value // I am good print(a)
解决方案
当然可以,以下是几种无需额外value属性的实现方式:
方法1:带原始值的枚举 + 重载==运算符
这是最简洁的方案,直接给枚举设置字符串原始值,再重载运算符让枚举实例能和字符串直接比较:
enum Apple: String { case good = "I am good" case bad = "I am bad" } // 重载==运算符,支持枚举与字符串直接比较 func ==(lhs: Apple, rhs: String) -> Bool { return lhs.rawValue == rhs } // 测试验证 print(Apple.good == "I am good") // 输出 true print(Apple.bad == "I am bad") // 输出 true
如果还希望打印枚举时直接输出目标字符串,只需让枚举遵循CustomStringConvertible,复用原始值即可:
enum Apple: String, CustomStringConvertible { case good = "I am good" case bad = "I am bad" var description: String { rawValue } } print(Apple.good) // 直接输出 "I am good"
方法2:遵循ExpressibleByStringLiteral(支持字符串转枚举)
如果需要支持把字符串直接赋值给枚举类型变量,同时保留比较能力,可以让枚举遵循ExpressibleByStringLiteral:
enum Apple: String, ExpressibleByStringLiteral, CustomStringConvertible { case good = "I am good" case bad = "I am bad" init(stringLiteral value: StringLiteralType) { // 可根据需求处理无效字符串,比如设置默认值或抛出错误 self = Apple(rawValue: value) ?? .good } var description: String { rawValue } } // 测试 let apple: Apple = "I am good" print(apple == .good) // 输出 true print(Apple.bad == "I am bad") // 输出 true print(apple) // 输出 "I am good"
方法3:自定义描述(侧重打印场景)
如果只是需要打印枚举时显示目标值,同时支持和字符串比较,也可以只实现CustomStringConvertible并重载运算符:
enum Apple: CustomStringConvertible { case good case bad var description: String { switch self { case .good: return "I am good" case .bad: return "I am bad" } } } func ==(lhs: Apple, rhs: String) -> Bool { return lhs.description == rhs } print(Apple.good) // 输出 "I am good" print(Apple.good == "I am good") // 输出 true
内容的提问来源于stack exchange,提问作者jacobcan118
相关产品推荐
相关产品推荐

