Различия в синтаксисе NSDateComponents?

Я работаю над приложением часов в Swift, и с Xcode 6.3.2 следующий код строится и работает нормально.

// Get current time
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond | .CalendarUnitNanosecond, fromDate: date)
let hour = components.hour % 12
let minute = components.minute
let second = components.second
let nanosecond = components.nanosecond

Однако, когда я загружаю тот же проект в бета-версии Xcode 7.0 и не делаю никаких изменений, я получаю сообщение об ошибке в строке calendar.components.

Could not find member 'CalendarUnitHour'

Я просмотрел документацию, и все константы NSCalendarUnit устарели (в iOS 8.0 это сказано), но описание метода для метода компонентов по-прежнему говорит об их использовании.

Я играл с другими значениями автозаполнения NSCalendarUnit, но ни один из них не создает рабочий код, и я не могу найти в Интернете недавние примеры, возможно, потому, что это совершенно новое.

Кто-нибудь знает новый правильный способ сделать это?


person zkarj    schedule 12.06.2015    source источник


Ответы (2)


Свифт 2

Имена NSCalendarUnit изменились в Swift 2.

Кроме того, теперь мы должны передать эти аргументы в OptionSet, например:

let components = calendar.components([.Hour, .Minute, .Second, .Nanosecond], fromDate: date)

Свифт 3

Согласно Руководству по проектированию Swift API, многое изменилось.

Обновленный синтаксис:

let date = Date()
let calendar = Calendar.current()
let components = calendar.components([.hour, .minute, .second, .nanosecond], from: date)

Свифт 4

Calendar.current теперь является собственностью, а .components переименовано в .dateComponents. В остальном это то же самое, что и в Swift 3.

let calendar = Calendar.current
let components = calendar.dateComponents([.hour, .minute, .second, .nanosecond], from: date)
person Eric Aya    schedule 12.06.2015
comment
Спасибо! Это сводило меня с ума. Мой код теперь чист на 100%. :-) - person zkarj; 13.06.2015
comment
Еще одно нелепое изменение, в котором нет способа понять это, кроме как найти этот вопрос SO. Спасибо, Apple! (сарказм). Спасибо Эрик! (не сарказм). - person datWooWoo; 13.10.2015
comment
Из-за изменений имени в Swift 2 это выдавало мне ошибку. Тип выражения неоднозначен без дополнительного контекста. - person Alphonse R. Dsouza; 07.01.2016
comment
На самом деле это не массив, а множество. - person gnasher729; 29.05.2016
comment
@lespommes: вы можете просто прочитать примечания к выпуску Swift 2. - person gnasher729; 29.05.2016

Теперь это новый протокол. OptionSetType

https://developer.apple.com/library/prerelease/mac/documentation/Swift/Reference/Swift_OptionSetType_Protocol/index.html

person brian.clear    schedule 12.10.2015
comment
почему голосование против. Это распространенная ошибка, которую люди совершают после перехода на Swift 2. Я даю вам техническую причину, по которой используется панель | больше не работает!! - person brian.clear; 13.10.2015