Рассчитать возраст от даты рождения с помощью 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

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

NSDate* birthday = ...;

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

- Это есть правильная форма лучше, чем это?

4 ответов


вы получили сообщение об ошибке, потому что 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!

Я создаю этот метод его очень легко просто поставить дату рождения в методе, и это вернет возраст как 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)")