Я начал с первого действия - получения вообще текущего времени, от которого буду отталкиваться.
Так, как интервал времени у нас по 5, то при клике на пикер, пользователь видит самое первое доступное время.
Добавил extension на тип Date -
enum DateRoundingType {
case round
case ceil
case floor
}
extension Date {
func rounded(minutes: TimeInterval, rounding: DateRoundingType = .round) -> Date {
return rounded(seconds: minutes * 60, rounding: rounding)
}
func rounded(seconds: TimeInterval, rounding: DateRoundingType = .round) -> Date {
var roundedInterval: TimeInterval = 0
switch rounding {
case .round:
roundedInterval = (timeIntervalSinceReferenceDate / seconds).rounded() * seconds
case .ceil:
roundedInterval = ceil(timeIntervalSinceReferenceDate / seconds) * seconds
case .floor:
roundedInterval = floor(timeIntervalSinceReferenceDate / seconds) * seconds
}
return Date(timeIntervalSinceReferenceDate: roundedInterval)
}
}
Добавил тип с которым буду работать
struct AvailableHour {
var value: Int
var timestamp: TimeInterval
var minute: [Int]
}
struct AvailableMinute {
var value: Int
}
И написал первый метод
let minutesInHours = [0, 5, 10, 15 ,20, 25, 30, 35, 40, 45, 50, 55]
func getNearestTime() {
let nearestDate = Date().rounded(minutes: 5, rounding: .ceil)
let hour = Calendar.current.component(.hour, from: nearestDate)
let minute = Calendar.current.component(.minute, from: nearestDate)
var availableHour = AvailableHour(value: hour,
timestamp: nearestDate.timeIntervalSince1970,
minute: [minute])
minutesInHours.forEach {
if $0 > minute {
availableHour.minute.append($0)
}
}
availableHours.append(availableHour)
calculateAvailableHours()
}
А вот как дальше быть, с методом calculateAvailableHours - не знаю
Пока что просто добавил все минуты до конца рабочего дня
func calculateAvailableHours() {
guard let startHour = availableHours.first else { return }
var currentHour = startHour.value
let endHour = endWorkday.value
while currentHour < endHour {
let nextHour = currentHour + 1
availableHours.append(AvailableHour(value: nextHour, timestamp: 0, minute: minutesInHours))
currentHour = nextHour
}
}
Соответсвенно, если у нас рабочий день до 20:30, а сейчас время 15:11 - На пикере будет 15:15 и можно будет переключать до 20:30. Но осталось только удалить занятые слоты. И пока не знаю как