Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从出生日期算起年龄_Ios_Swift - Fatal编程技术网

Ios 从出生日期算起年龄

Ios 从出生日期算起年龄,ios,swift,Ios,Swift,我从出生日期算不出年龄。我得到的是 fatal error: unexpectedly found nil while unwrapping an Optional value (lldb) 我的代码 override func viewDidLoad() { super.viewDidLoad() var dateString = user.birthday var dateFormatter = NSDateFormatter() // t

我从出生日期算不出年龄。我得到的是

fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) 
我的代码

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
        }
    }
override func viewDidLoad(){
super.viewDidLoad()
var dateString=user.birth
var dateFormatter=NSDateFormatter()
//这很重要-我们将输入日期格式设置为与输入字符串匹配
dateFormatter.dateFormat=“dd-MM-yyyy”
//瞧!
var dateFromString=dateFormatter.dateFromString(dateString)
让年龄=计算年龄(dateFromString!)
}
func calculateAge(生日: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)
如果((dateComponentNow.month
更新:Xcode 11•Swift 5.1

您可以使用日历方法dateComponents计算从特定日期到今天的年数:

extension Date {
    var age: Int { Calendar.current.dateComponents([.year], from: self, to: Date()).year! }
}


在Swift 2.0+age中,计算代码应如下所示:

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

只需使用DateTools吊舱。绝对是最简单的方法。

斯威夫特3

import DateTools

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

重要提示:

必须将时区设置为创建UTC出生日期,否则时区之间将存在不一致

斯威夫特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.")
        }
    }

}
用法:

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

print(age)

你在哪一行得到错误?dateString的内容是什么?最有可能的原因是
let age=calculateAge(dateFromString!)
。如果不知道在Swift2@SwiftArchitect中要实现什么
dateString
containsHow,就很难提出解决方案?为什么要使用DateComponents扩展?它使用现有的init方法
public-init编译(并运行)得很好(在Xcode 8 beta 4中)(日历:日历?=默认,时区:时区?=默认,纪元:整数?=默认,年:整数?=默认,月:整数?=默认,日:整数?=默认,小时:整数?=默认,分钟:整数?=默认,秒:整数?=默认,纳秒:整数?=默认,工作日:整数?=默认,工作日:整数?=默认,季度:整数?=默认,周:整数=默认值,weekOfYear:Int?=默认值,yearForWeekOfYear:Int?=默认值)
let dob = Date(year: 1975, month: 1, day: 1)
let age = dob.age

print(age)