Swift3 在Swift 3中展开可选值时意外发现nil

Swift3 在Swift 3中展开可选值时意外发现nil,swift3,Swift3,我有一个时间表应用程序,在将所有内容转换为Swift 3后,某一行抛出了EXC_BAD_指令错误,声明在展开可选值时意外发现了nil 这是代码,最后一行返回错误: class CyclicDay { enum CyclicDayError: Error { case invalidStartDate } lazy var baseline: Date! = { var compone

我有一个时间表应用程序,在将所有内容转换为Swift 3后,某一行抛出了EXC_BAD_指令错误,声明在展开可选值时意外发现了nil

这是代码,最后一行返回错误:

 class CyclicDay {
            enum CyclicDayError: Error {
                case invalidStartDate }
            lazy var baseline: Date! = {
                var components = DateComponents()
                components.day = 27
                components.month = 3
                components.year = 2017
                return Calendar.current.date(from: components)!
            }()
            func dayOfCycle(_ testDate: Date) throws -> Int {
                if let start = baseline {
                    let interval = testDate.timeIntervalSince(start as Date)
                    let days = interval / (60 * 60 * 24)
                    return Int(days.truncatingRemainder(dividingBy: 14)) + 1 }
             throw CyclicDayError.invalidStartDate }}



    override func viewDidLoad() {

        // Do any additional setup after loading the view, typically from a nib.
        let cd = CyclicDay()
        let day = try! cd.dayOfCycle(Date())
        let date = Date()
        let calendar = Calendar.current
        let components = calendar.dateComponents([.hour, .minute], from: date)
        let hour = components.hour
        let minutes = components.minute
        _ = "\(String(describing: hour)):\(String(describing: minutes))"

        let lengthTestHour = "\(String(describing: hour))"
        let lengthTestMinute = "\(String(describing: minutes))"

        let formatter = DateFormatter()
        formatter.dateFormat = "a"
        formatter.amSymbol = "AM"
        formatter.pmSymbol = "PM"

        let dateString = formatter.string(from: Date())

        var finalHour = String()
        if lengthTestHour.characters.count == 1 {
            finalHour = String("0\(String(describing: hour))")
        } else {
             finalHour = "\(String(describing: hour))"
        }
        if lengthTestMinute.characters.count == 1 {
            _ = "0\(String(describing: minutes))"
        } else {_ = minutes }
        let convert = finalHour
        let mTime = Int(convert)


        // mTime * 100 + minutes
        let compTime = mTime! * 100 + minutes! 

在Swift 3中,所有日期组件都是可选的,您需要打开选项

let hour = components.hour!
let minutes = components.minute!
否则,字符串插值会带来麻烦

顺便说一句:你不需要字符串描述,只是写个例子

_ = "\(hour):\(minutes)"

不管怎样,我想知道为什么您要手动执行所有格式化工作,而不是使用您创建的日期格式化程序。

问题在于以下两行:

let lengthTestHour = "\(String(describing: hour))"
let lengthTestMinute = "\(String(describing: minutes))"
您认为lengthTestHour将存储7这样的值,而lengthTestMinute将存储33这样的值。但不,lengthTestHours实际上持有期权7,lengthTestMinutes实际上持有期权33

然后指定lengthTestHour进行转换,并尝试将Optional7转换为Int,这显然是不可能的。现在mTime为零,您尝试在最后一行强制展开。轰

这是因为StringDescripting:返回一个可选的。可以通过以下操作缩短和固定这两条线:

let lengthTestHour = "\(hour!)"
let lengthTestMinute = "\(minute!)"