を試してみてください。 switch文は、それらの異なる型をどのように扱うかを知る方法がありません。
私はあなたが、曜日の日数のセットや週末の曜日のセットなど、特定の種類の曜日のセットに一致するように思っています。この場合、スイッチのケースステートメントは、Set<RepeatDay>
と比較できるSet<RepeatDay
である必要があります。
switch days {
case [.Monday, .Tuesday, .Wednesday, .Thursday, .Friday]:
print("Weekdays")
case [.Saturday, .Sunday]:
print("Weekends")
default:
print(days)
}
私はDay
列挙型の静的メンバであることに、それらのcase文セットを抽出し、日の連続した区間を記述するためのいくつかのより多くのロジックを追加します。あなたはまた、weekdaySymbols
の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.
'repeatDay'の宣言についてより多くの文脈を与えてください – Alexander
ところで、あなたのenumに' String'描画値があるとき、デフォルトの生の値はケース名に設定されているので、jusを書くことができます'case Monday =' case Monday = '' Monday "' – Alexander
ああ、大丈夫です。しかし、私が言ったように期待することは、5つの平日のすべてが選択されている場合は、日が 'Mon'、 'Tue'にそれぞれ選択されたときに短縮し、 '平日'を持つことができるようにすることです。 – Shyam