🧰
[CasePaths]enumをより簡単に値にアクセスできるように
CasePaths
v1.1.0(Swift 5.9)からマクロにより、より簡単にenumの値にアクセスできるようになりました。
CasePathsで出来るようになること
値へのアクセスが簡単に
通常enumで追加した値(associated value)にアクセスするにはif case
やswitch
を使用する必要がありましたが、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