检查枚举中是否存在某个值

5
以下是我的枚举类型。
enum HomeDataType: String, CaseIterable {
  case questions           = "questions"
  case smallIcons          = "smallIcons"
  case retailers           = "retailers"
  case products            = "products"
  case banners             = "banners"
  case single_product      = "single_product"
  case single_retail       = "single_retail"
  case categories          = "categories"
  case airport             = "All_Airport"
  case single_banner       = "single_banner"
  case none                = "none"
}

想要检查一个值是否存在于枚举中吗?怎么做?


你的问题不够清晰。你是想问 "banners" 是否是一个有效的值吗?你可以使用 HomeDataType.init(rawValue: "banners") 并检查它是否为 nil。或者,如果你有一个具有多个可能值的 HomeDataType,那么你需要一个 OptionSet,但可能需要进行其他更改。 - Larme
5个回答

9
你可以尝试使用字符串初始化一个新的枚举案例,或者检查所有案例是否包含与你的字符串相等的rawValue:
let string = "categories"

if let enumCase = HomeDataType(rawValue: string) {
    print(enumCase)
}

if HomeDataType.allCases.contains(where: { $0.rawValue == string }) {
    print(true)
}

我的首选方案是确保枚举类型实现了CaseIterable协议,如果不确定如何实现,请查看相关代码。 - Michel Storms

2
使用rawValue初始化枚举将返回一个可选项,因此您可以尝试对其进行解包。
if let homeDataType = HomeDataType (rawValue: value) {
    // Value present in enum
} else {
    // Value not present in enum
}

1
你可以为枚举添加静态方法,该方法尝试创建枚举实例并返回其是否成功。
 static func isPresent(rawValue: String) -> Bool {
    return HomeDataType(rawValue: rawValue) != nil
 }

 HomeDataType.isPresent(rawValue: "foobar") // false
 HomeDataType.isPresent(rawValue: "banners") // true

您可以扩展RawRepresentable并创建泛型方法 extension RawRepresentable { static func contains(_ rawValue: RawValue) -> Bool { Self.init(rawValue: rawValue) != nil } } - Leo Dabus

0

最简单的解决方案。你不需要CaseIterable协议。

guard let type = HomeDataType(rawValue: string) else { return }
switch type {
    case .questions:
    ...
}

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接