swiftnsdatecomponents

Calculate age from birth date using NSDateComponents in Swift


I am trying calculate the age from birthdayDate in Swift with this function:

var calendar : NSCalendar = NSCalendar.currentCalendar()

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

But I get an error Extra argument toDate in call

In objective c this was the code, but I don't know why get this error:

NSDate* birthday = ...;

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

Is there correct form better than this?


Solution

  • You get an error message because 0 is not a valid value for NSCalendarOptions. For "no options", use NSCalendarOptions(0) or simply nil:

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

    (Specifying nil is possible because NSCalendarOptions conforms to the RawOptionSetType protocol which in turn inherits from NilLiteralConvertible.)

    Update for Swift 2:

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

    Update for Swift 3:

    Assuming that the Swift 3 types Date and Calendar are used:

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