Sie sind auf einem Set<RepeatDay>
Schalt, aber der Fall ist, ein RepeatDay
. Die switch-Anweisung kann nicht wissen, wie Sie mit diesen verschiedenen Typen umgehen.
Ich vermute, Sie versuchen, bestimmte Arten von Sätzen von Tagen, wie die Anzahl der Tage, die Wochentage sind, und die Anzahl der Tage sind Wochenenden. In diesem Fall müssen die Fallanweisungen Ihres Switches Set<RepeatDay
sein, was mit dem bereitgestellten Set<RepeatDay>
verglichen werden kann.
switch days {
case [.Monday, .Tuesday, .Wednesday, .Thursday, .Friday]:
print("Weekdays")
case [.Saturday, .Sunday]:
print("Weekends")
default:
print(days)
}
würde ich diese Aussagen Fall Sets extrahieren in statische Mitglieder der Day
Enum zu sein, und fügen Sie etwas mehr Logik zum Beschreiben aufeinanderfolgenden Intervallen von Tagen. Sie können auch die locale-genauen Namen für Tage aus der weekdaySymbols
von DateFormatter
import Foundation
extension Array where Element: Integer {
func isConsecutive() -> Bool {
guard var previous = self.first else { return true }
for current in self[1 ..< self.count] {
if current != previous + 1 { return false }
previous = current
}
return true
}
}
enum Day: Int, CustomStringConvertible {
case Sunday
case Monday
case Tuesday
case Wednesday
case Thursday
case Friday
case Saturday
/*TODO: Note that this stores the weekdaySymbols permanently once
the app is launched. If there is a change in locale after the app
launch, then the days will not be updated. If this is a concern,
this `DayNames` constant should be deleted, and all references
to it should be changed to DateFormatter().weekdaySymbols, which
will dynamically obtain the weekdays accurate to the current locale */
static let DayNames: [String] = DateFormatter().weekdaySymbols
public var description: String { return Day.DayNames[self.rawValue] }
static let Everyday: Set<Day> = [.Sunday, .Monday, .Tuesday, .Wednesday, .Thursday, .Friday, .Saturday]
static let Weekdays: Set<Day> = [.Monday, .Tuesday, .Wednesday, .Thursday, .Friday]
static let Weekends: Set<Day> = [.Saturday, .Sunday]
static func describeDays(_ days: Set<Day>) -> String {
guard days.count > 0 else { return "No days" }
switch days { // Predefined cases
case Day.Everyday: return "Everyday"
case Day.Weekdays: return "Weekdays"
case Day.Weekends: return "Weekends"
default: break
}
let array = days.map{ $0.rawValue }.sorted()
switch array {
case _ where array.isConsecutive(): // Consecutive range of days
let min = array.first!
let max = array.last!
return "\(Day(rawValue: min)!) - \(Day(rawValue: max)!)"
default: return days.description //arbitrary days
}
}
}
print(Day.describeDays(Day.Everyday))
print(Day.describeDays(Day.Weekdays))
print(Day.describeDays(Day.Weekends))
print(Day.describeDays([.Monday, .Tuesday, .Wednesday, .Thursday])) // Monday - Thursday
print(Day.describeDays([.Tuesday, .Wednesday, .Thursday, .Saturday])) //[Saturday, Wednesday, Thursday, Tuesday]
You can see this in action, here.
Geben Sie uns mehr Kontext über die Deklaration von 'repeatDay' – Alexander
BTW, wenn Ihre enum einen 'String'-Zeichenwert hat, werden die Standard-Raw-Werte auf die Fallnamen gesetzt, so dass Sie jus schreiben können t 'Fall Montag' statt 'Fall Montag = "Montag" ' – Alexander
Oh, okay. Aber was ich erwarte, ist, dass ich abkürzen kann, wenn die Tage auf "Mon", "Di" bzw. "Wochentage" ausgewählt sind, wenn alle fünf Wochentage ausgewählt sind. – Shyam