Различия в синтаксисе 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 beta и не изменяю никаких изменений, я получаю сообщение об ошибке в строке calendar.components.
Could not find member 'CalendarUnitHour'
Я просмотрел документацию, и все константы NSCalendarUnit устарели (в iOS 8.0, которые она говорит), но описание метода для метода компонентов все еще говорит, чтобы использовать их.
Я играл с другими значениями автозаполнения NSCalendarUnit, но ни один из них не создает рабочий код, и я не могу найти последние примеры в Интернете, возможно, потому что это совершенно новый.
Кто-нибудь знает новый правильный способ сделать это?
Ответы
Ответ 1
Swift 2
Имена NSCalendarUnit
изменены в Swift 2.
Кроме того, теперь мы должны передать эти аргументы в OptionSet, например:
let components = calendar.components([.Hour, .Minute, .Second, .Nanosecond], fromDate: date)
Swift 3
Многие вещи изменились в соответствии с Swift API Design Guidelines.
Обновлен синтаксис:
let date = Date()
let calendar = Calendar.current()
let components = calendar.components([.hour, .minute, .second, .nanosecond], from: date)
Swift 4
Calendar.current
теперь является свойством, а .components
переименовано в .dateComponents
. В противном случае это то же самое, что и в Swift 3.
let calendar = Calendar.current
let components = calendar.dateComponents([.hour, .minute, .second, .nanosecond], from: date)
Ответ 2
Теперь они стали новым протоколом.
OptionSetType
https://developer.apple.com/library/prerelease/mac/documentation/Swift/Reference/Swift_OptionSetType_Protocol/index.html