当 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 提示时,信任该宏。
在 WWDC '23 推出,需要 Swift 5.9