В SwiftUI у меня есть средство выбора (на основе UISegmentedControl), которое использует перечисление для случаев (и строк), которые оно отображает следующим образом:
enum DayRange: String, CaseIterable, Identifiable {
case fourteen = "14 Days"
case ninety = "90 Days"
case allTime = "All Time"
var id: String { self.rawValue }
}
Эти случаи используются в логике на экране отчетов для определения диапазонов дат и т. д.
Но сейчас я локализую приложение, так что...
Действительно ли для этих строк невозможно использовать каталог строк (в целях локализации)?
Эти строки не отображаются автоматически в каталоге строк... и я не уверен, как бы я ссылался на них из кода, даже если бы они там были.
Я робко попробовал... это?:
enum DayRange: LocalizedStringKey, CaseIterable, Identifiable {
case fourteen = "14 Days"
case ninety = "90 Days"
case allTime = "All Time"
var id: LocalizedStringKey { self.rawValue }
}
Но там написано, что его больше невозможно идентифицировать.





Просто добавьте свойство LocalizedStringKey и верните строковые литералы из этого свойства. Это приведет к добавлению строк в каталог строк.
enum DayRange: String, CaseIterable, Identifiable {
case fourteen
case ninety
case allTime
var localized: LocalizedStringKey {
switch self {
case .fourteen:
"14 Days"
case .ninety:
"90 Days"
case .allTime:
"All Time"
}
}
var id: String { self.rawValue }
}
Ваша вторая попытка приводит к тому, что перечисление не соответствует Identifiable, потому что Identifiable требует, чтобы тип id был Hashable, но LocalizedStringKey не является Hashable, только Equatable.
Само перечисление неявно является Hashable, поэтому альтернативный подход — просто использовать само перечисление в качестве id. Поскольку каждый случай перечисления имеет уникальное необработанное значение, это не меняет идентичность случаев перечисления по сравнению с использованием rawValue в качестве id.
enum DayRange: LocalizedStringKey, CaseIterable, Identifiable {
case fourteen = "14 Days"
case ninety = "90 Days"
case allTime = "All Time"
var id: DayRange { self }
}