You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:13:30