IdentifiedEnumCases Swift 宏

当 Swift 枚举具有关联值时,它的 case 无法作为代码被引用。如果可以引用 case 的名称,即使关联值未知,也会非常方便。

这个宏会创建一个 ID 枚举,用于引用每个 case。此外,它还会创建一个计算属性 id,以便轻松获取每个 case 的标识符。

在过去的项目中,我每次都手动编写这段代码。但是现在有了 Swift 宏,一切都变得简单了!Swift 枚举只需要一个注解,就会为每个 case 创建标识符!

import IdentifiedEnumCases

@IdentifiedEnumCases
enum Nightshade {
  case potato(PotatoVariety), tomato(TomatoVariety)
  case chili(ChiliVariety)

  enum PotatoVariety: CaseIterable {
    case russet, yukonGold, kennebec
  }
  enum TomatoVariety: CaseIterable {
    case roma, heirloom, cherry
  }
  enum ChiliVariety: CaseIterable {
    case jalapeño, arbol, habenero
  }
}

然后在代码中,我们可以直接引用 case 的 ID。

let romaTomato = Nightshade.tomato(.roma)
XCTAssertEquals(romaTomato.id, .tomato)

因为宏会生成

enum Nightshade {
  case potato(PotatoVariety), tomato(TomatoVariety)
  case chili(ChiliVariety)

  enum PotatoVariety: CaseIterable {
    case russet, yukonGold, kennebec
  }

  enum TomatoVariety: CaseIterable {
    case roma, heirloom, cherry
  }

  enum ChiliVariety: CaseIterable {
    case jalapeño, arbol, habenero
  }

  var caseID: CaseID {
    switch self {
    case .potato: .potato
    case .tomato: .tomato
    case .chili: .chili
    }
  }

  enum CaseID: String, Hashable, CaseIterable {
    case potato, tomato, jalapeño
  }
}

非常令人兴奋!

公共可见性

如果枚举是 public 的,那么生成的 CaseID 枚举和生成的 caseID 访问器也将是 public 的。例如,

import IdentifiedEnumCases

@IdentifiedEnumCases
public enum AppRoute {
  case item(ItemRoute)
  case user(UserRoute)
}

生成为

public enum AppRoute {
  case item(ItemRoute)
  case user(UserRoute)

  public var caseID: CaseID {
    switch self {
    case .item: .item
    case .user: .user
  }

  public enum CaseID: String, Hashable, CaseIterable {
    case item
    case user
  }
}

安装

Package.swift 中,将此 package 添加到你的依赖项中。

.package(url: "https://github.com/FullQueueDeveloper/IdentifiedEnumCases.git", from: "1.0.0"),

并将 "IdentifiedEnumCases" 添加到你的 target 的依赖项列表中。

当 Xcode 提示时,信任该宏。

Swift 宏?

在 WWDC '23 推出,需要 Swift 5.9

许可证

BSD-3-Clause