Как я могу использовать функцию диапазона NSCalendar в календаре?

У меня есть следующий код, который использовал компиляцию в Swift 2, но не будет в Swift 4.2. Функция диапазона, возвращающая логическое значение, больше не является частью типа данных Calendar, однако она является частью типа данных NSCalendar. Есть ли способ использовать или отформатировать эту функцию, чтобы она скомпилировалась в Swift 4.2?

extension Calendar {
    /**
     Returns a tuple containing the start and end dates for the week that the
     specified date falls in.
     */
    func weekDatesForDate(date: NSDate) -> (start: NSDate, end: NSDate) {
        var interval: TimeInterval = 0
        var start: NSDate?
        range(of: .weekOfYear, start: &start, interval: &interval, for: date as Date)
        let end = start!.addingTimeInterval(interval)

        return (start!, end)
    }
}

Я пробовал следующее, однако функция диапазона не совпадает и не компилируется:

extension NSCalendar {
    /**
     Returns a tuple containing the start and end dates for the week that the
     specified date falls in.
     */
    func weekDatesForDate(date: NSDate) -> (start: NSDate, end: NSDate) {
        var interval: TimeInterval = 0
        var start: NSDate?
        range(of: .weekOfYear, start: &start, interval: &interval, for: date as Date)
        let end = start!.addingTimeInterval(interval)

        return (start!, end)
    }
}

person Laurence Wingo    schedule 20.10.2018    source источник


Ответы (1)


Эквивалентом range(of:start:interval:for:) в Calendar является dateInterval(of:start:interval:for:)

Не используйте NSDate в Swift

extension Calendar {
    /**
     Returns a tuple containing the start and end dates for the week that the
     specified date falls in.
     */
    func weekDatesForDate(date: Date) -> (start: Date, end: Date) {
        var interval: TimeInterval = 0
        var start = Date()
        dateInterval(of: .weekOfYear, start: &start, interval: &interval, for: date)
        let end = start.addingTimeInterval(interval)

        return (start, end)
    }
}

Я рекомендую использовать выделенный DateInterval в качестве возвращаемого значения, а не кортеж:

extension Calendar {
    /**
     Returns a tuple containing the start and end dates for the week that the
     specified date falls in.
     */
    func weekDatesForDate(date: Date) -> DateInterval {
        var interval: TimeInterval = 0
        var start = Date()
        dateInterval(of: .weekOfYear, start: &start, interval: &interval, for: date)
        let end = start.addingTimeInterval(interval)
        return DateInterval(start: start, end: end)
    }
}
person vadian    schedule 20.10.2018
comment
Он говорит, что функция dateInterval не используется. Вы утверждаете, что приведение результата к типу данных DateInterval в основном решило проблему без необходимости использования функции dateInterval? - person Laurence Wingo; 20.10.2018
comment
Обе версии должны работать одинаково. Говорит ли он, что функция dateInterval не используется или результат функции dateInterval не используется. Сама функция явно не используется. - person vadian; 20.10.2018
comment
Если вы получили предупреждение о том, что результат не используется, напишите _ = dateInterval(... - person vadian; 20.10.2018