Функция отметки времени, которая работала надежно, только что вызвала EXC_BAD_INSTRUCTION

Я использовал эту функцию для создания метки времени. Я нашел это где-то здесь, на переполнении стека.

@objc public class var timestamp: String {
    return "\(Int(NSDate().timeIntervalSince1970 * 1000))"
}

Это работало без проблем, но я только что получил EXC_BAD_INSTRUCTION:

fatal error: floating point value cannot be converted to Int because it is greater than Int.max

Поскольку разработка этого приложения близится к завершению, я нервничаю, когда вдруг вижу, что это вызывает EXC_BAD_INSTRUCTION. Это выполняется в симуляторе, но у меня установлены правильные дата и время.

Любые идеи или предложения или с благодарностью. Ниже приведен обратный след.

(lldb) bt
* thread #1: tid = 0x15c4d, 0x04a30393 libswiftCore.dylib`function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> () + 67, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
frame #0: 0x04a30393 libswiftCore.dylib function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> () + 67
* frame #1: 0x00afe0c9 TDTPhotoLib static     
TDTDeviceUtilites.timestamp.getter(self=TDTPhotoLib.TDTDeviceUtilites) + 409 at TDTDeviceUtilites.swift:127
frame #2: 0x00166979 Oilist TDTPaintingViewController.finshedSession(sender=0x7aee0fb0, self=0x7e9d3800) -> () + 169 at TDTPaintingViewController.swift:1370
frame #3: 0x00102896 Oilist TDTOilistMenuPainting.goForward(sender=0x7aee0fb0, self=0x7c218770) -> () + 374 at TDTOilistMenuPainting.swift:149
frame #4: 0x0010290d Oilist @objc TDTOilistMenuPainting.goForward(UIButton!) -> () + 61 at TDTOilistMenuPainting.swift:0
frame #5: 0x018a80b5 libobjc.A.dylib -[NSObject performSelector:withObject:withObject:] + 84
frame #6: 0x0336ee38 UIKit -[UIApplication sendAction:to:from:forEvent:] + 118
frame #7: 0x0336edb7 UIKit -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 64
frame #8: 0x03512f3b UIKit -[UIControl sendAction:to:forEvent:] + 79
frame #9: 0x035132d4 UIKit -[UIControl _sendActionsForEvents:withEvent:] + 433
frame #10: 0x035122c1 UIKit -[UIControl touchesEnded:withEvent:] + 714
frame #11: 0x033ef52e UIKit -[UIWindow _sendTouchesForEvent:] + 1095
frame #12: 0x033f05cc UIKit -[UIWindow sendEvent:] + 1159
frame #13: 0x03391be8 UIKit -[UIApplication sendEvent:] + 266
frame #14: 0x03366769 UIKit _UIApplicationHandleEventQueue + 7795
frame #15: 0x02423e5f CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
frame #16: 0x02419aeb CoreFoundation __CFRunLoopDoSources0 + 523
frame #17: 0x02418f08 CoreFoundation __CFRunLoopRun + 1032
frame #18: 0x02418846 CoreFoundation CFRunLoopRunSpecific + 470
frame #19: 0x0241865b CoreFoundation CFRunLoopRunInMode + 123
frame #20: 0x07031664 GraphicsServices GSEventRunModal + 192
frame #21: 0x070314a1 GraphicsServices GSEventRun + 104
frame #22: 0x0336ceb9 UIKit UIApplicationMain + 160
frame #23: 0x00131ed1 Oilist main + 145 at AppDelegate.swift:14
frame #24: 0x05631a25 libdyld.dylib start + 1
 Jeshua Lacock02 июн. 2016 г., 08:51
Хм, поэтому я изменил коэффициент с 1000 на 10, и у меня все еще был такой же EXC_BAD. Убрал множитель и все работает. Но если он работал с 1000, я понятия не имею, почему он неожиданно терпит неудачу с 10?

Ответы на вопрос(1)

Решение Вопроса

4, 5), потому что результат

NSDate().timeIntervalSince1970 * 1000
// E.g.: 1464850525047.38

не вписывается в 32-разрядное целое число. В качестве решения используйте 64-битные целые числа:

Int64(NSDate().timeIntervalSince1970 * 1000)

В качестве альтернативы, если целью является созданиестрока представляя миллисекунды, используйте форматирование строки вместо целочисленного преобразования:

String(format:"%.0f", NSDate().timeIntervalSince1970 * 1000)
 Jeshua Lacock02 июн. 2016 г., 09:00
Странно, так как я думал, что тестировал его на iPhone 5 раньше. В любом случае, кажется, что это делает свое дело, и переход на 64-битную версию, безусловно, дает ему гораздо больше возможностей, спасибо
 Jeshua Lacock02 июн. 2016 г., 20:28
Я вижу, что произошло сейчас - я случайно установил свою цель на 32-разрядное устройство. Рад, что сделал, хотя не думаю, что приложение будет поддерживать любые 32-битные устройства.
 Jeshua Lacock02 июн. 2016 г., 09:02
Хорошее редактирование - это выглядит еще безопаснее!

Ваш ответ на вопрос