Как проверить перекрытие времени в Swift? - PullRequest
0 голосов
/ 10 декабря 2018

У меня 4 вида DateTime DatePicker и 4 EndTime datePicker в моем представлении.Я хочу проверить, совпадает или нет время.

Ex. slot 1 = 09:00 - 12:00
slot 2 = 08:00 - 11:00
slot 3 = 05:00 - 10:30
slot 4 = 11:00 - 16:00

Я преобразую это время в десятичное с помощью этой формулы:

(Минуты + (Часы * 6)) / 10

Теперь у меня есть десятичное время, поэтому я попробовал следующий код:

for item in validationArray! {
            let startIndexvalue:Int = item["startTime"]!
            let stopIndexvalue:Int = item["stopTime"]!

            print(startIndexvalue)
            print(stopIndexvalue)
            print(fastLinkStartTime)

            if stopIndexvalue > startIndexvalue {
                if startIndexvalue ... stopIndexvalue ~= fastLinkStartTime {

                    if startIndexvalue == 0 {
                        validationTimeDic["startTime"] = fastLinkStartTime
                        timeDic["startTime"] = hours + "0"
                    }

                    else {
                        showValidationAlert(title: NSLocalizedString("You can not select time in between existing time slot.", comment: ""), message: "")
                        DispatchQueue.main.async {
                            self.StartTime.text = "--:--"
                        }

                        validationTimeDic["startTime"] = 0
                        timeDic["startTime"] = "--:--"
                    }

                    validationArray?[currentRow] = validationTimeDic
                    self.currentObject!.validationData[currentSection.description] = validationArray

                    array?[currentRow] = timeDic
                    self.currentObject!.mondayToSundayData[currentSection.description] = array

                    print(self.currentObject!.validationData)

                }
            }

Пожалуйста, дайте мне какую-нибудь идею сделать это?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Вы можете расширить класс Range для этого использования или использовать пересечение в классе CGRect.

// Использование CGRect

var r1 = CGRect(x: 4.8, y: 0, width: 1.8, height: 1)
var r2 = CGRect(x: 5.8, y: 0, width: 2, height: 1)
var r3 = CGRect(x: 6, y: 0, width: 0.8, height: 1)

r1.intersection(r2).intersection(r3)

// Использование ClosedRange

extension CountableClosedRange where Bound == Int {
        func intersection(_ range: CountableClosedRange<Int>) -> CountableClosedRange<Int>? {
            if(self.lowerBound >= range.upperBound) {
                return nil;
            }
            if(self.upperBound <= range.lowerBound) {
                return nil;
            }
            return CountableClosedRange(uncheckedBounds:
                (lower: self.lowerBound > range.lowerBound ?
                    self.lowerBound
                    :range.lowerBound,
                 upper: self.upperBound < range.upperBound ?
                    self.upperBound
                    :range.upperBound))
        }
    }

    func convertTime(h:Int, m: Int = 0) -> Int {
        return m+h*60;
    }
    var range1 = CountableClosedRange(uncheckedBounds: (lower: 48 , upper: 56))
    var range2 = CountableClosedRange(uncheckedBounds: (lower: 53 , upper: 55))
    var range3 = CountableClosedRange(uncheckedBounds: (lower: 45 , upper: 54))
    var range4 = CountableClosedRange(uncheckedBounds: (lower: 47 , upper: 64))
    let arr = [range2,range3,range4]
    var resultRange:CountableClosedRange<Int>? = range1
    for item in arr {
        resultRange = resultRange?.intersection(item)
    }
0 голосов
/ 17 декабря 2018
  for i in 0..<validationArray!.count {
                var currentItem = validationArray![i]
                let currentStart:Int = currentItem["startTime"]!
                let currentEnd:Int = currentItem["stopTime"]!
                if currentStart != 0 && currentEnd != 0 {
                    if i < (validationArray?.count)! - 1  {
                        let nextItem = validationArray![i+1]
                        let nextStart:Int = nextItem["startTime"]!
                        let nextEnd:Int = nextItem["stopTime"]!
                        if currentEnd > currentStart {
                            if nextEnd  <  currentStart {
                                currentItem["stopTime"] = fastLinkStopTime
                                timeDic["stopTime"] = hours + "0"
                            }
                            else if nextStart >  currentEnd {
                                currentItem["stopTime"] = fastLinkStopTime
                                timeDic["stopTime"] = hours + "0"
                            }
                            else {
                                showValidationAlert(title: NSLocalizedString("Your heating time is in an already set heating interval.", comment: ""), message: "")
                                DispatchQueue.main.async {
                                    self.StopTime.text = "--:--"
                                }
                                fastLinkStopTime = 255
                                timeDic["stopTime"] = "--:--"
                                dataArray?[currentRow] = timeDic
                                self.currentObject!.mondayToSundayData[currentSection.description] = dataArray
                            }
                        }
                        else {
                            showValidationAlert(title: NSLocalizedString("Please check your entry. The start time must not be before the end time.", comment: ""), message: "")
                            DispatchQueue.main.async {
                                self.StopTime.text = "--:--"
                            }
                        }
                    }
                    else
                    {
                        break
                    }
                }
            }
0 голосов
/ 10 декабря 2018

Вам необходимо проверить, не перекрываются ли два диапазона Date.Это можно сделать, проверив, перекрывает ли один ClosedRange<Date> другой

let isOverlapping = (startDate1...endDate1).overlaps(startDate2...endDate2)

Но для вашего случая вы не хотите добавлять это время (в вашем случае Int index) кмассив, если он перекрывается с любым другим временем в массиве, поэтому перед добавлением этого нового времени проверьте, не перекрывается ли он с другим временем.Если не добавляет, если делает, делайте что хотите.

let array: [[String: Int]] = ...
let newStartIndex: Int = ...
let newEndIndex: Int = ...
let isOverlapping = array.allSatisfy { $0["startTime"] <= newEndIndex && newStartIndex <= $0["stopTime"]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...