Вычислить возраст с даты рождения с использованием 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 это был код, но я не знаю, почему эта ошибка возникает:
- Swift 2 - UnsafeMutablePointer для объекта
- Передача массива функции с переменным числом аргументов в Swift
- Как проверить, находится ли элемент в массиве
- Расширение не может содержать хранимое свойство, но почему статическое разрешено
- Запрос HTTP в Swift с методом POST
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];
Правильная ли форма лучше этого?
- Общая функция, использующая имя типа в Swift
- Использование переменной типа в общем
- Можете ли вы переопределить между расширениями в Swift или нет? (Компилятор кажется смущенным!)
- Быстрые дженерики, не сохраняющие тип
- Как я могу расширить типизированные массивы в Swift?
- Выберите случайный элемент из массива
- Почему константа ограничивает свойство из экземпляра структуры, но не экземпляр classа?
- Быстрое наследование протокола и соответствие протокола
Вы получите сообщение об ошибке, потому что 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)")