2016-11-25 2 views
1

Запуск моего кода на симуляторе iPhone 5 вызывает исключение, указанное на изображении. Выполнение кода на любом из других тренажеров просто отлично.EXC_BAD_INSTRUCTION только в симуляторе iPhone 5

Я не могу определить, где я ошибся в этой незаметной строке кода. У кого-нибудь еще есть эта проблема?

Exception shown in XCode

+0

Является ли результат тем же, если вы используете 'Date()' вместо 'NSDate()'? –

+1

На самом деле этот код довольно впечатляющий. Почему вы ссылаетесь на NSInteger в Swift? Или, если это Swift 3, NSDate? – matt

+0

Кроме того, говоря «пользователь!» Означает «сбой меня». Даже если вы считаете, что это не проблема, неспособность проверить, что 'user' не' nil', просто глупо. – matt

ответ

2

NSInteger (который является типом псевдоним для Int в Swift) представляет собой 32-битовое целое число на 32-разрядных платформах, как iPhone 5. Результат

NSInteger(NSDate().timeIntervalSince1970) * 1000 

является 1480106653342 (в данный момент) и не помещается в диапазон -2^31 ... 2^31-1 из 32-разрядных (подписанных) целых чисел. Поэтому Swift прерывает выполнение. (Swift не «обрежет» результата целого числа арифметических операций, как это делается в некоторых других языках программирования, если вы специально не использовать «перелив» операторов, такие как &*.)

Вы можете использовать Int64 для 64- разрядные вычисления на все платформы:

Int64(NSDate().timeIntervalSince1970 * 1000) 

В вашем случае, если строка нужна:

let lastLogin = String(Int64(NSDate().timeIntervalSince1970 * 1000)) 
+0

Не знал об этой 32-битной платформе 64-битной платформы, но я дам ей попробовать, хотя – Dreanaught

+0

Спасибо за отзыв с разницей в платформе. Это дало мне понять, почему это не работает. Использование нашего предложения не помогло мне, потому что firebase не нравится тип Int64 в первую очередь. Чтобы получить миллисекунды с Epoc (1970), я подошел к раунду (NSDate(). TimeIntervalSince1970 * 1000 – Dreanaught

+0

@Dreanaught: вы все еще можете преобразовать его в строку, как это было в вашем исходном коде, см. Обновленный ответ. –

Смежные вопросы