为什么我会收到“致命错误:在打开Optional值时意外发现nil”?

时间:2016-05-30 16:20:00

标签: ios swift

我在Swift中遇到一个我不明白的错误。这是我操场上的代码:

class Person : CustomStringConvertible
{

    let Name :String;
    let DoB :NSDate?

    init(name :String, dob :NSDate?)
    {
        Name = name;
        DoB = dob;
    }

    func age() -> Double {
        let now = NSDate();
        let age :Double = now.timeIntervalSinceDate(self.DoB!);

        return age;
    }

    var description : String {
        return "Name: \(Name), Age: \(self.age())";
    }

}

extension NSDate {
    static func dateFromComponents(year :Int, month :Int, day :Int) -> NSDate {
        let components = NSDateComponents();
        components.year = year;
        components.month = month;
        components.day = day;
        return components.date!;
    }
}

let helena = Person(name: "Helena", dob: NSDate.dateFromComponents(1986, month: 8, day: 10));
print(helena);

2 个答案:

答案 0 :(得分:4)

NSDateComponents date属性的文档:

  

如果接收方的nil属性值为calendar或无法将接收方转换为NSDate对象,则返回nil

您尚未设置日期组件' calendar.date为零。有关展开选项的详情,请阅读the answers on this question

答案 1 :(得分:1)

你的问题是那个

NSDate.dateFromComponents(1986, month: 8, day: 10)

返回nil。

您可以通过创建这样的日期对象来解决这个问题:

let format = NSDateFormatter()
format.dateFormat = "yyyy-MM-dd"
let date = format.dateFromString("1986-08-10")!

然后像这样传递:

let helena = Person(name: "Helena", dob: date);
print(helena);

使用NSCalender

let components = NSDateComponents()
components.year = 2000
components.month = 8
components.day = 1
let calender = NSCalendar(calendarIdentifier:  NSCalendarIdentifierISO8601)
let date2 = calender!.dateFromComponents(components)

let helena2 = Person(name: "Helena", dob: date2);