Могу ли я перенести Int64 прямо в Int?

В последнее время я использую SQLite.swift для создания базы данных приложений. И я определяю все мои столбцы INTEGER с помощью типа Int64 , как объясняет документация.

Но время от времени мне нужно, чтобы Int64 был просто Int . Поэтому мой вопрос: если я это сделаю:

 //Create a table with Int instead of Int64 let test_id = Expression<Int>("test_id") let tests = db["tests"] db.create(table: tests, ifNotExists: true){ t in t.column(test_id) } class func insertTest(t: Int) -> Int{ //insert.rowid returns an Int64 type let insert = tests.insert(test_id <- t) if let rowid = insert.rowid{ //directly cast Int64 into Int return Int(rowid) } return 0 } 

Будет ли это правильно?

Конечно, я протестировал его. И он работает, но я читал этот вопрос в Stackoverflow

И похоже, что у меня может быть проблема с 32-битными устройствами …

Если это неправильно, как я могу сделать Int64 в Int ?

2 Solutions collect form web for “Могу ли я перенести Int64 прямо в Int?”

Преобразование Int64 в Int путем передачи значения Int64 в инициализатор Int всегда будет работать на 64-битной машине, и он будет разбиваться на 32-битной машине, если целое число находится за пределами диапазона Int32.min ... Int32.max .

Для обеспечения безопасности используйте init(truncatingBitPattern) для преобразования значения:

 return Int(truncatingBitPattern: rowid) 

На 64-битной машине truncatingBitPattern ничего не сделает; вы просто получите Int (такой же размер, как Int64 ).

На 32-битной машине это выкинет верхние 32 бита, но все они равны нулю, тогда вы не потеряли никаких данных. Таким образом, пока ваше значение будет вписываться в 32-битный Int , вы можете сделать это без потери данных. Если ваше значение вне диапазона Int32.min ... Int32.max , это изменит значение Int64 во что-то, что помещается в 32-битный Int , но оно не будет сбой.


Вы можете увидеть, как это работает на игровой площадке. Поскольку Int в Playground – это 64-битный Int , вы можете явно использовать Int32 для имитации поведения 32-разрядной системы.

 let i: Int64 = 12345678901 // value bigger than maximum 32-bit Int let j = Int32(truncatingBitPattern: i) // j = -539,222,987 let k = Int32(i) // crash! 

Обновление для Swift 3

В дополнение к init(truncating:) который все еще работает, Swift 3 вводит отказоустойчивые инициализаторы для безопасного преобразования одного целочисленного типа в другой. С помощью init?(exactly:) вы можете передать один тип для инициализации другого, и он возвращает nil если инициализация завершается с ошибкой. Возвращаемое значение является необязательным, которое должно быть развернуто обычными способами.

Например:

 let i: Int64 = 12345678901 if let j = Int32(exactly: i) { print("\(j) fits into an Int32") } else { // the initialization returned nil print("\(i) is too large for Int32") } 

Это позволяет применять оператор объединения nil для подачи значения по умолчанию, если преобразование не выполняется:

 // return 0 if rowid is too big to fit into an Int on this device return Int(exactly: rowid) ?? 0 

На самом деле я тоже работал с этой картой, и в основном я просто использовал противоположное решение. Всякий раз, когда вы видите, что типы не совпадают, просто выполните

 Int64(yourInt) 

(протестировано с Xcode 7, Swift 2.0)

  • productsRequest не работает в быстрой для покупок в приложении
  • Как проверить, работает ли приложение IOS в первый раз, используя SWIFT
  • iOS и Swift: CLLocationManagerDelegate не обновляет координаты местоположения за пределами первого местоположения
  • Как реализовать автозаполнение для городов с MapKit?
  • Метод делегата должен быть объявлен открытым
  • Swift UIView animateWithDuration завершение закрытия называется немедленно
  • Переменная не изменена в пользовательском инициализаторе
  • Pushkit VoiP push-уведомления пробуждают время выполнения приложения
  • Частота & демпфирование SKPhysicsJointSpring в Swift
  • Как преобразовать байты в значение float в swift?
  • Металл iOS дает ошибку компиляции
  • Interesting Posts

    iCarousel не плавно прокручивается

    Приложение расширения приложений для iOS 8 и Host в отдельных файлах проекта. Возможно ли это в Xcode 6?

    Проблема с идентификатором приложения Wildcard с Xcode 8.0

    загрузка приложения iOS с часами 2.0 дает ITC.apps.preReleaseBuild.errors.invalidBinary

    Как добавить ввод текста в alertview ios 8?

    Не удалось удалить локальное уведомление из Lockscreen

    Лучшее место для хранения Включенные учетные данные AWS в приложении iOS

    Приложение iOS – Как реализовать автоматическое обновление cookie сеанса с использованием AFNetworking 2

    ios google maps делегирует события, не стреляя в симулятор

    AVCaptureStillImageOutput Изображение, перевернутое вверх дном

    потоковое аудио через UDP с помощью CocoaAsyncSocket в быстрой

    Как имитировать поведение UISearchBar в Safari в iOS

    UIStackView: действительно ли необходимо вызвать removeFromSuperView и removeArrangedSubview для удаления подвью?

    Интеграция объявлений Leadbolt в iPhone

    Комплект интеграции CCAvenue Gateway для приложения ios

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.