如果年份小于1948年或超过2086年,为什么应用程序崩溃?

时间:2017-08-27 21:21:29

标签: ios swift

我的Xcode应用程序崩溃,如果用户输入的年份低于1948年,或者例如超过2086年,并且想知道是否有人之前有过此问题以及如何解决?

用户选择他们的出生日期,应用程序会显示数据,例如今天的日期和出生日期之间的秒数。

我是Xcode(Xcode 8)的新手,所以还在学习。提前致谢

@IBAction func clickScreenBtn(_ sender: Any) {


    let birthDay = UserDefaults.standard.object(forKey: "birthday") as! Date
    var component = NSCalendar.current.dateComponents([.day], from: birthDay, to: Date())



    type = type + 1

    switch type {
    case 0:
        unitLabel.text = "Days"
        timeLabel.text = ""
        timeLabel.text = timeLabel.text?.appendingFormat("%d", component.day!)
        break
    case 4:
        type = 0
        unitLabel.text = "Days"
        timeLabel.text = ""
        timeLabel.text = timeLabel.text?.appendingFormat("%d", component.day!)
        break
    case 1:
        component = NSCalendar.current.dateComponents([.hour], from: birthDay, to: Date())
        unitLabel.text = "Hours"
        timeLabel.text = ""
        timeLabel.text = timeLabel.text?.appendingFormat("%d", component.hour!)
        break
    case 2:
        component = NSCalendar.current.dateComponents([.minute], from: birthDay, to: Date())
        unitLabel.text = "Minutes"
        timeLabel.text = ""
        timeLabel.text = timeLabel.text?.appendingFormat("%d", component.minute!)
        break
    case 3:

        component = NSCalendar.current.dateComponents([.second], from: birthDay, to: Date())

        unitLabel.text = "Seconds"
        timeLabel.text = ""
        timeLabel.text = timeLabel.text?.appendingFormat("%d", component.second!)


        break
    default:
        break
    }
}

错误:

 0x108142301 <+9425>:  callq  0x1082a95c4               ; symbol stub for: Foundation.Calendar.dateComponents (Swift.Set<Foundation.Calendar.Component>, from : Foundation.Date, to : Foundation.Date) -> Foundation.DateComponents
0x108142306 <+9430>:  movq   -0x710(%rbp), %rdi
0x10814230d <+9437>:  movq   %rax, -0x730(%rbp)
0x108142314 <+9444>:  callq  0x10813d8a0               ; swift_rt_swift_release
0x108142319 <+9449>:  movq   -0x730(%rbp), %rax
0x108142320 <+9456>:  movq   %rax, -0x8(%rbp)
0x108142324 <+9460>:  movq   -0x218(%rbp), %rdi
0x10814232b <+9467>:  callq  0x10813d8a0               ; swift_rt_swift_release
0x108142330 <+9472>:  movq   0x1e3081(%rip), %rax      ; (void *)0x000000010e87f068: swift_isaMask
0x108142337 <+9479>:  movq   -0x168(%rbp), %rdx
0x10814233e <+9486>:  movq   (%rdx), %rdi
0x108142341 <+9489>:  andq   (%rax), %rdi
0x108142344 <+9492>:  movq   %rdi, -0x738(%rbp)
0x10814234b <+9499>:  movq   %rdx, %rdi
0x10814234e <+9502>:  movq   -0x738(%rbp), %rax
0x108142355 <+9509>:  callq  *0x80(%rax)
0x10814235b <+9515>:  movq   %rax, -0x70(%rbp)
0x10814235f <+9519>:  movq   -0x230(%rbp), %rax
0x108142366 <+9526>:  movsd  -0x1d8(%rbp), %xmm0       ; xmm0 = mem[0],zero 
0x10814236e <+9534>:  movd   %xmm0, %rax
0x108142373 <+9539>:  cmpq   $0x0, -0x70(%rbp)
0x108142378 <+9544>:  jne    0x108142409               ; <+9689> at MainViewController.swift
0x10814237e <+9550>:  movq   -0x230(%rbp), %rax
0x108142385 <+9557>:  movsd  -0x1d8(%rbp), %xmm0       ; xmm0 = mem[0],zero 
0x10814238d <+9565>:  movd   %xmm0, %rax
0x108142392 <+9570>:  movq   -0x230(%rbp), %rax
0x108142399 <+9577>:  movsd  -0x1d8(%rbp), %xmm0       ; xmm0 = mem[0],zero 
0x1081423a1 <+9585>:  movd   %xmm0, %rax
0x1081423a6 <+9590>:  movq   -0x230(%rbp), %rax
0x1081423ad <+9597>:  movsd  -0x1d8(%rbp), %xmm0       ; xmm0 = mem[0],zero 
0x1081423b5 <+9605>:  movd   %xmm0, %rax
0x1081423ba <+9610>:  leaq   0x1b13f9(%rip), %rdi      ; "fatal error"
0x1081423c1 <+9617>:  movl   $0xb, %eax
0x1081423c6 <+9622>:  movl   %eax, %esi
0x1081423c8 <+9624>:  movl   $0x2, %eax
0x1081423cd <+9629>:  leaq   0x1b13ac(%rip), %rcx      ; "unexpectedly found nil while unwrapping an Optional value"
0x1081423d4 <+9636>:  movl   $0x39, %edx
0x1081423d9 <+9641>:  movl   %edx, %r8d
0x1081423dc <+9644>:  xorl   %edx, %edx
0x1081423de <+9646>:  movl   %edx, -0x73c(%rbp)
0x1081423e4 <+9652>:  movl   %eax, %edx
0x1081423e6 <+9654>:  movl   %eax, %r9d
0x1081423e9 <+9657>:  movl   $0x0, (%rsp)
0x1081423f0 <+9664>:  callq  0x1082a95f4               ; symbol stub for: function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never
0x1081423f5 <+9669>:  movq   -0x230(%rbp), %rcx
0x1081423fc <+9676>:  movsd  -0x1d8(%rbp), %xmm0       ; xmm0 = mem[0],zero 
0x108142404 <+9684>:  movd   %xmm0, %rcx
0x108142409 <+9689>:  leaq   -0x70(%rbp), %rax
0x10814240d <+9693>:  movq   -0x70(%rbp), %rcx
0x108142411 <+9697>:  movq   %rcx, %rdi
0x108142414 <+9700>:  movq   %rax, -0x748(%rbp)
0x10814241b <+9707>:  movq   %rcx, -0x750(%rbp)
0x108142422 <+9714>:  callq  0x1082a9858               ; symbol stub for: objc_retain
0x108142427 <+9719>:  leaq   0x1b1398(%rip), %rdi      ; "Seconds"

1 个答案:

答案 0 :(得分:1)

如果你摆脱了所有!并用一些实际的错误检查替换它们,你应该能够很快找到错误发生的位置。例如,此版本将记录控制台出错的地方:

@IBAction func clickScreenBtn(_ sender: Any) {
    guard let birthDay = UserDefaults.standard.object(forKey: "birthday") as? Date else {
        print("Couldn't get birthday")
        return
    }

    let currentDate = Date()

    guard let day = Calendar.current.dateComponents([.day], from: birthDay, to: currentDate).day else {
        print("Couldn't get day")
        return
    }

    type = type + 1

    switch type {
    case 0:
        unitLabel.text = "Days"
        timeLabel.text = "\(day)"
    case 4:
        type = 0
        unitLabel.text = "Days"
        timeLabel.text = "\(day)"
    case 1:
        guard let hour = Calendar.current.dateComponents([.hour], from: birthDay, to: currentDate).hour else {
            print("Couldn't get hour")
            return
        }

        unitLabel.text = "Hours"
        timeLabel.text = "\(hour)"
    case 2:
        guard let minute = Calendar.current.dateComponents([.minute], from: birthDay, to: currentDate).minute else {
            print("Couldn't get minute")
            return
        }

        unitLabel.text = "Minutes"
        timeLabel.text = "\(minute)"
    case 3:
        guard let second = Calendar.current.dateComponents([.second], from: birthDay, to: currentDate).second else {
            print("Couldn't get second")
            return
        }

        unitLabel.text = "Seconds"
        timeLabel.text = "\(second)"
    default:
        break
    }
}

一旦您知道问题实际发生的位置,就应该更容易解决问题。