2017-10-20 9 views
1

私は、スウィフト習慣構築アプリケーションを構築しています。ある時点で、ユーザは、作成したい習慣の期間(日数)を選択する。ユーザーは、曜日(日曜、月曜、火曜日など)を練習したい曜日を選択することもできます。開始日は、習慣を作成する日です。Swiftで日付範囲を反復する最も効果的な方法は何ですか?

私は現在、開始日と終了日(ユーザーが選択した日数に基づいて)を持っています。しかし、その日付範囲内では、ユーザーが選択した特定の日の日付を抽出する必要があります。

私の考えは、時間間隔(startDate、endDate)内のすべての平日の値 'x'に対して、カレンダーの日付を返します。しかし、私はDateIntervalを作成しようとしましたが、プロトコル 'Sequence'に準拠していないため、繰り返し処理できません。

この日付範囲で反復処理を行い、これらの他の日付を抽出する効率的な方法はありますか?私はまだ考えていないより良い方法がありますか?ここで

は、以下の私の現在の日付スターターコードです:あなたの助けを

var date = Date() 
var duration = 10 
let calendar = Calendar.current 

let dateEnding = Calendar.current.date(byAdding: .day, value: duration, to: date as Date)! 

//Returns a number representing day of the week. i.e. 1 = Sunday 
let weekDay = calendar.component(.weekday, from: date) 


//Initializing a time interval, based on user selected duration and start date 
let timeInterval = DateInterval.init(start: date, end: dateEnding) 

おかげで...

答えて

2

をお試しくださいいくつかの平日を休みにし、期間を日数として提供します。

// User selected weekdays (1 = Sunday, 7 = Saturday) 
var selectedWeekdays = [2, 4, 6] // Example - Mon, Wed, Fri 
var duration = 10 // Example - 10 days 

let calendar = Calendar.current 
var today = Date() 
let dateEnding = calendar.date(byAdding: .day, value: duration, to: today)! 

var matchingDates = [Date]() 
// Finding matching dates at midnight - adjust as needed 
let components = DateComponents(hour: 0, minute: 0, second: 0) // midnight 
calendar.enumerateDates(startingAfter: today, matching: components, matchingPolicy: .nextTime) { (date, strict, stop) in 
    if let date = date { 
     if date <= dateEnding { 
      let weekDay = calendar.component(.weekday, from: date) 
      print(date, weekDay) 
      if selectedWeekdays.contains(weekDay) { 
       matchingDates.append(date) 
      } 
     } else { 
      stop = true 
     } 
    } 
} 

print("Matching dates = \(matchingDates)") 
+0

brilliant - 完全に動作します。ありがとうございました!!! – sharedev

1

は私が正しくあなたの質問を理解していれば、ユーザーはチェックします。この

let calendar = NSCalendar.currentCalendar() 
let startDate = ... 
let endDate = ... 
let dateRange = calendar.dateRange(startDate: startDate, 
            endDate: endDate, 
            stepUnits: .Day, 
            stepValue: 1) 

for date in dateRange { 
    print("It's \(date)!") 
} 
+1

これはスウィフト2のコードです:次のように一致する日付のリストを取得することができ、あなたは配列と期間で選択された平日を持っていると仮定すると

。どうして?スウィフト2はもうなくなってしまった。 Swift 4は現在のバージョンです。 – rmaddy

+0

残念ながら、dateRangeは廃止され、Swift 4では動作しなくなりました。 – sharedev

関連する問題