Вычислить возраст с даты рождения с использованием NSDateComponents в Swift

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

var calendar : NSCalendar = NSCalendar.currentCalendar() var dateComponentNow : NSDateComponents = calendar.components( NSCalendarUnit.CalendarUnitYear, fromDate: birthday, toDate: age, options: 0) 

Но я получаю сообщение об ошибке Extra argument toDate in call

В объективе c это был код, но я не знаю, почему эта ошибка возникает:

 NSDate* birthday = ...; NSDate* now = [NSDate date]; NSDateComponents* ageComponents = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:birthday toDate:now options:0]; NSInteger age = [ageComponents year]; в NSDate* birthday = ...; NSDate* now = [NSDate date]; NSDateComponents* ageComponents = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:birthday toDate:now options:0]; NSInteger age = [ageComponents year]; 

Правильная ли форма лучше этого?

Вы получите сообщение об ошибке, потому что 0 не является допустимым значением для NSCalendarOptions . Для «без параметров» используйте NSCalendarOptions(0) или просто nil :

 let ageComponents = calendar.components(.CalendarUnitYear, fromDate: birthday, toDate: now, options: nil) let age = ageComponents.year 

(Указание nil возможно, потому что NSCalendarOptions соответствует протоколу RawOptionSetType , который, в свою очередь, наследуется от NilLiteralConvertible .)

Обновление для Swift 2:

 let ageComponents = calendar.components(.Year, fromDate: birthday, toDate: now, options: []) 

Обновление для Swift 3:

Предполагая, что типы Swift 3 Date и Calendar используются:

 let now = Date() let birthday: Date = ... let calendar = Calendar.current let ageComponents = calendar.dateComponents([.year], from: birthday, to: now) let age = ageComponents.year! 

Я создаю этот метод очень просто, просто поставлю дату рождения в методе, и это вернет Age как Int

Swift 3

 func calcAge(birthday: String) -> Int { let dateFormater = DateFormatter() dateFormater.dateFormat = "MM/dd/yyyy" let birthdayDate = dateFormater.date(from: birthday) let calendar: NSCalendar! = NSCalendar(calendarIdentifier: .gregorian) let now = Date() let calcAge = calendar.components(.year, from: birthdayDate!, to: now, options: []) let age = calcAge.year return age! } 

Swift 2

 func calcAge(birthday: String) -> Int{ let dateFormater = NSDateFormatter() dateFormater.dateFormat = "MM/dd/yyyy" let birthdayDate = dateFormater.dateFromString(birthday) let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) let now: NSDate! = NSDate() let calcAge = calendar.components(.Year, fromDate: birthdayDate!, toDate: now, options: []) let age = calcAge.year return age } 

Применение

 print(calcAge("06/29/1988")) 

Это работает в swift 3 для меня ..

 let now = NSDate() let calendar : NSCalendar = NSCalendar.current as NSCalendar let ageComponents = calendar.components(.year, from: datePickerView.date, to: now as Date, options: []) let age = ageComponents.year! ageCalculated.text = String(age) 

Благодаря @Martin R

Это работает для Swift 3

 let myDOB = Calendar.current.date(from: DateComponents(year: 1994, month: 9, day: 10))! let myAge = Calendar.current.dateComponents([.month], from: myDOB, to: Date()).month! let years = myAge / 12 let months = myAge % 12 print("Age : \(years).\(months)") 
  • Двумерный массив в Swift
  • Как создать глобальную переменную?
  • В чем причина ошибки этого типа?
  • Передача списков из одной функции в другую в Swift
  • Использование в качестве конкретного типа, соответствующего протоколу AnyObject, не поддерживается
  • Вернуть тип instancetype в Swift
  • Вызывается метод расширения Swift, а не метод, реализованный в подclassе
  • Отменить синхронизированное событие в Swift?
  • Можно ли добавить ограничения типа в расширение соответствия протокола Swift?
  • Как узнать, является ли буква буквенно-цифровой или цифрой в Swift
  • Как получить байты из UnsafeMutableRawPointer?
  • Давайте будем гением компьютера.