Я предлагаю, чтобы targetFrequency
было Int
.
. Вы должны использовать [Int: Enum1]
для хранения отображений между targetFrequency
и Enum1
:
static let targetFrequencyDict: [Int: Enum1] = {
func accumulate(dict: inout [Int: Enum1], freq: Enum1) {
dict[freq.targetFrequency] = freq
}
return [Enum1.none, .weekly, .monthly, .quarterly, .semiannually, .annually].reduce(into: [Int: Frequency](), accumulate)
}()
Затем вы можете использовать targetFrequencyDict
, чтобы получить желаемое значение Enum1
:
Enum1.targetFrequencyDict[52] // weekly
Кроме того, чтобы уменьшить некоторые операторы switch, вы можете превратить Enum1
в структуру и иметь static let
s в качестве перечисления:
struct Frequency: CustomStringConvertible {
let description: String
let timePeriod: DateComponents
let targetFrequency: Int
private init(description: String, timePeriod: DateComponents, targetFrequency: Int) {
self.description = description
self.timePeriod = timePeriod
self.targetFrequency = targetFrequency
}
static let none = Frequency(description: "None", timePeriod: DateComponents(days: 0) , targetFrequency: 0)
static let weekly = Frequency(description: "Weekly", timePeriod: DateComponents(days: 7) , targetFrequency: 52)
static let monthly = Frequency(description: "Monthly", timePeriod: DateComponents(months: 1) , targetFrequency: 12)
static let quarterly = Frequency(description: "Quarterly", timePeriod: DateComponents(months: 3) , targetFrequency: 4)
static let semiannually = Frequency(description: "Semi-annually", timePeriod: DateComponents(months: 6) , targetFrequency: 2)
static let annually = Frequency(description: "Annually", timePeriod: DateComponents(years: 1) , targetFrequency: 1)
static let targetFrequencyDict: [Int: Frequency] = {
func nextResult(dict: inout [Int: Frequency], freq: Frequency) {
dict[freq.targetFrequency] = freq
}
return [Frequency.none, .weekly, .monthly, .quarterly, .semiannually, .annually].reduce(into: [Int: Frequency](), nextResult)
}()
}