Skip to main content

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 に載る
1Text("key1")oo
2Text(str1)xx
3Text(localizedKey1)ox
4String(localized: "key1")oo
5String(localized: str1)ox
6LocalizedStringKey("key1")-o
  • 文字列リテラルだと 1 の動作で便利だなと思ってたら
  • 変数にしたら 2, 5 のケースで Localizable の編集画面に自動で載らないのが悩み
  • 解決策 6 → 3 と渡す、で問題解決 → さらに、enum の getter にしとくと 1 箇所にまとまってスッキリ

・・というところがミソ

使用例

たとえば Picker で

文字列(ローカライズ対応)にしたい場合

swift
Picker("", selection: $appData.selectedSidebarType) {
ForEach(SidebarType.allCases) { item in
Text(item.label).tag(item.rawValue)
}
}
.pickerStyle(.segmented)

アイコンにしたい場合

swift
Picker("", selection: $appData.selectedSidebarType) {
ForEach(SidebarType.allCases) { item in
Image(systemName: item.iconName).tag(item.rawValue)
}
}
.pickerStyle(.segmented)