2016-11-02 3 views
0
enum RepeatDay : String, CustomStringConvertible { 
    case Monday = "Monday" 
    case Tuesday = "Tuesday" 
    case Wednesday = "Wednesday" 
    case Thursday = "Thursday" 
    case Friday = "Friday" 
    case Saturday = "Saturday" 
    case Sunday = "Sunday" 

    var description : String { return rawValue } 

    static let allValues = [Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday] 
} 

Das obige ist in meinem Modell deklariert. Dies wäre ein ähnlicher Anwendungsfall wie die Tagesauswahl in der App "Stock Clock" beim Einrichten eines Alarms.Verwenden von Switch-Anweisungen auf Sets (Swift 3)

Aber das beschwert sich !!

  guard let repeatDay = $0 else { return "" } 
      switch repeatDay { 
      case .Monday : 
       break 
      default: 
       break 
      } 

screenshot

wo repeatDay a gesetzt wird, wie in dem oben angegebenen Bildschirm.

Gibt es eine Möglichkeit zur Verwendung von switch-Anweisung in diesem Szenario? Alle Alternativen sind willkommen.

+0

Geben Sie uns mehr Kontext über die Deklaration von 'repeatDay' – Alexander

+0

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

+0

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

Antwort

0

Versuchen Sie, diese

guard let repeatDay = RepeatDay(rawValue: $0) else { return "" } 
    switch repeatDay { 
    case .Monday : 
     break 
    default: 
     break 
    } 
0

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.

0

Die Art von 0 in Ihrem Verschluss $ erhalten, ist nicht RepeatDay aber Set<RepeatDay>, versuchen Sie dies:

guard let repeatDay = $0.first else { return "" } 
    switch repeatDay { 
    case .Monday : 
     break 
    default: 
     break 
    }