🧰

[CasePaths]enumをより簡単に値にアクセスできるように

2023/11/16に公開

CasePaths

v1.1.0(Swift 5.9)からマクロにより、より簡単にenumの値にアクセスできるようになりました。
https://github.com/pointfreeco/swift-case-paths

CasePathsで出来るようになること

値へのアクセスが簡単に

通常enumで追加した値(associated value)にアクセスするにはif caseswitchを使用する必要がありましたが、CasePathsを使うとネストせず通常のプロパティのように、アクセスすることができます。

これは@CasePathableというマクロと@dynamicMemberLookupという機能のおかげです。

// 標準のSwiftでのアクセス
enum Destination {
  case home(String)
  case settings(String)
}

let destination: Destination = .home("name1")
if case .home(let string) = destination {
  print(string) // name1
}
// CasePathsを使ったアクセス
@CasePathable
@dynamicMemberLookup
enum Destination {
  case home(String)
  case settings(String)
}

let destination: Destination = .home("name1")
let extractdString: String? = destination.home
print(extractdString) // name1

値の変更が簡単に

通常のSwiftで値を変更するには、取り出してから変更するなどが必要ですが、CasePathsにはmodifyという関数が用意されているので、そちらが利用可能です。

var destination: Destination = .home("name1")
destination.modify(\.home) { $0 += "_modified" }
print(destination) // home("home1_modified")

enumの判定

どのcaseかを判定するときに、標準のSwiftだと少し意味のないコードを書かないといけません。
CasePathsではisという関数が用意されているので、そちらが利用可能です。

// 標準のSwiftでの判定
if case .home(_) = destination {
  print(true) // homeの時の判定
}
// CasePathsでの判定
if destination.is(\.home) {
  print(true) // homeの時の判定
}

Discussion