'Calculate age from birth date

I cant find age in from birth date. What I got is

fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) 

My code

override func viewDidLoad() {
        super.viewDidLoad()
var dateString = user.birthday
        var dateFormatter = NSDateFormatter()
        // this is imporant - we set our input date format to match our input string
        dateFormatter.dateFormat = "dd-MM-yyyy"
        // voila!
        var dateFromString = dateFormatter.dateFromString(dateString)

        let age = calculateAge(dateFromString!)
}

func calculateAge (birthday: NSDate) -> NSInteger {

        var userAge : NSInteger = 0
        var calendar : NSCalendar = NSCalendar.currentCalendar()
        var unitFlags : NSCalendarUnit = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay
        var dateComponentNow : NSDateComponents = calendar.components(unitFlags, fromDate: NSDate())
        var dateComponentBirth : NSDateComponents = calendar.components(unitFlags, fromDate: birthday)

        if ( (dateComponentNow.month < dateComponentBirth.month) ||
            ((dateComponentNow.month == dateComponentBirth.month) && (dateComponentNow.day < dateComponentBirth.day))
            )
        {
            return dateComponentNow.year - dateComponentBirth.year - 1
        }
        else {
            return dateComponentNow.year - dateComponentBirth.year
        }
    }


Solution 1:[1]

Important:

The timezone must be set to create a UTC birth date otherwise there will be inconsistencies between timezones.

Swift 3

extension Date {

    //An integer representation of age from the date object (read-only).
    var age: Int {
        get {
            let now = Date()
            let calendar = Calendar.current

            let ageComponents = calendar.dateComponents([.year], from: self, to: now)
            let age = ageComponents.year!
            return age
        }
    }

    init(year: Int, month: Int, day: Int) {
        var dc = DateComponents()
        dc.year = year
        dc.month = month
        dc.day = day

        var calendar = Calendar(identifier: .gregorian)
        calendar.timeZone = TimeZone(secondsFromGMT: 0)!
        if let date = calendar.date(from: dc) {
            self.init(timeInterval: 0, since: date)
        } else {
            fatalError("Date component values were invalid.")
        }
    }

}

Usage:

let dob = Date(year: 1975, month: 1, day: 1)
let age = dob.age

print(age)

Solution 2:[2]

In Swift 2.0+ age computing code should look something like this:

extension NSDate {
    var age:Int {
        return NSCalendar.currentCalendar()
            .components(NSCalendarUnit.Year, 
                        fromDate: self, 
                        toDate: NSDate(),
                        options: NSCalendarOptions(rawValue: 0)
            .year
    }
}

Solution 3:[3]

Just use the DateTools pod. Absolutely the easiest way. https://github.com/MatthewYork/DateTools

For Swift 3

import DateTools

let birthday: Date = ....
let ageString = String((Date() as NSDate).years(from: birthday))

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Struchu
Solution 3 ykonda