2016-11-02 8 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] 
} 

上記は私のモデルで宣言されています。これは、アラームを設定している間、在庫の時計アプリでの曜日の選択と同様の使用例です。セット(Swift 3)のスイッチステートメントの使用

しかし、以下は不満です!上記のスクリーンショットに示すようにrepeatDayは、設定されている

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

screenshot

このシナリオでswitch文を使用する方法はありますか?どのような選択肢も大歓迎です。

+0

'repeatDay'の宣言についてより多くの文脈を与えてください – Alexander

+0

ところで、あなたのenumに' String'描画値があるとき、デフォルトの生の値はケース名に設定されているので、jusを書くことができます'case Monday =' case Monday = '' Monday "' – Alexander

+0

ああ、大丈夫です。しかし、私が言ったように期待することは、5つの平日のすべてが選択されている場合は、日が 'Mon'、 'Tue'にそれぞれ選択されたときに短縮し、 '平日'を持つことができるようにすることです。 – Shyam

答えて

0

はあなたがSet<RepeatDay>に切り替えているが、ケースがRepeatDayあるこの

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

を試してみてください。 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文セットを抽出し、日の連続した区間を記述するためのいくつかのより多くのロジックを追加します。あなたはまた、weekdaySymbolsDateFormatter

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

あなたの閉鎖で$ 0種類がRepeatDayではなく、Set<RepeatDay>から日間ロケールの正確な名前を取得することができ、これを試してみてください。

guard let repeatDay = $0.first else { return "" } 
    switch repeatDay { 
    case .Monday : 
     break 
    default: 
     break 
    } 
関連する問題