这种方法应该大部分有效。它不会考虑不兼容的日历之间的转换,但几乎所有语言环境的日历都基于公历,因此至少对于那些日历,它应该提供所需的行为。
import SwiftUI
// This extension adapted from https://stackoverflow.com/a/74035064/14840926
extension Calendar {
/// Array of weekday values
/// - Returns: An array of `Int` that represent the days of the week where 1 = Sunday and 7 = Saturday.
/// Should Foundation ever support calendars with weekdays != 7, the mapping breaks.
func orderedWeekdays() -> [Int] {
return Array(firstWeekday...(weekdaySymbols.count)) + Array(1..<firstWeekday)
}
}
struct WeekdayMenuInAForm: View {
@State private var universalWeekday = 2
@State private var localeID = "en_US"
var body: some View {
let locale = Locale(identifier: localeID)
let calendar = locale.calendar
let weekdaySymbols = calendar.weekdaySymbols // Always starts at "Sunday"
Form {
Picker("Locale", selection: $localeID) {
ForEach(["ar_AR", "en_US", "en_UK", "fr_FR", "fr_CA", "he_IL"], id: .self) { locale in
Text(locale)
}
}
Picker("Weekday", selection: $universalWeekday) {
ForEach(calendar.orderedWeekdays(), id: .self) { weekdayIndex in
Text(weekdaySymbols[weekdayIndex-1]).tag(weekdayIndex)
}
}
Text("The stored value of our weekday is (universalWeekday)")
}
}
}
struct WeekdayMenuInAForm_Previews: PreviewProvider {
static var previews: some View {
WeekdayMenuInAForm()
}
}