Enum とローカライズキー
Enum の定義
以下のように定義しておくと、使いやすい
- LocalizedKey の computed property を用意する (例では label)
- CaseIterable にしておく
- 使うなら、アイコン用の imageName も用意しておく
swift
import SwiftUI
enum SidebarType: String, CaseIterable, Identifiable {
case folders
case tags
case settings
var id: Self { self }
var label: LocalizedKey {
switch self {
case .folders : "TagLabel.Folders"
case .tags : "TagLabel.Tags"
case .settings : "TagLabel.Settings"
}
}
var localized: String {
LocalizedStringKey(self.localizedKey)
}
var imageName: String {
switch self {
case .folders : "folder"
case .tags : "tag"
case .settings : "gearshape"
}
}
}
ポイント
| # | コード | ローカライズされる | Localizable.strings に載る |
|---|---|---|---|
| 1 | Text("key1") | o | o |
| 2 | Text(str1) | x | x |
| 3 | Text(localizedKey1) | o | x |
| 4 | String(localized: "key1") | o | o |
| 5 | String(localized: str1) | o | x |
| 6 | LocalizedStringKey("key1") | - | o |
- 文字列リテラルだと 1 の動作で便利だなと思ってたら
- 変数にしたら 2, 5 のケースで Localizable の編集画面に自動で載らないのが悩み
- 解決策 6 → 3 と渡す、で問題解決 → さらに、enum の getter にしとくと 1 箇所にまとまってスッキリ
・・というところがミソ
使用例
たとえば Picker で