Могу ли я перенести 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 ?

Преобразование 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)

  • Получите Int из UILabel Swift
  • swift - JSON для NSManagedObject
  • Обнаруживать, когда пользователь остановился / приостановил ввод текста в Swift
  • WKWebView падает, если пользователь отвечает на входящий iMessage
  • Затухание тени вместе с SKSpriteNode, который отбрасывает ее
  • Внедрение библиотеки SWRevealViewConroller (выпадающее меню) в нескольких раскадках
  • Swift ios не уверен, как подключиться или использовать встроенный UIPageViewController
  • табличное пространство боковой поверхности Swift
  • iOS-диаграммы Float для Integer YAxis
  • Как реализовать горизонтально бесконечное прокручивание UICollectionView?
  • Динамическое создание схемы в Realm
  • Interesting Posts

    Обнаружение отвода внутри пути безье

    Быстрая метатипическая несогласованность

    приостанавливать проигрыватель при переходе на задний план и возобновлять его, когда приложение возвращается на передний план ios

    MonoTouch.Foundation.MonoTouchException выбрано исключение Objective-C. Имя: NSInternalInconsistencyException

    CGAffineTransformScale не отправляет масштаб при использовании UIDynamicAnimator

    DidReceiveWriteRequest не будет вызван в IOS BLE

    Изображение панели вкладок не отображается

    Использование делегата для передачи данных для резервного копирования стека навигации

    Создание цвета RGB в xcode

    Номер мобильного телефона iPhone с использованием базовой телефонии

    Xamarin iOS В вашем приложении используется параметр компилятора, для которого требуется xamarin.ios Business edition

    Запись аудиофайла с помощью AVAudioEngine

    не удается удалить архитектуру arm64 Xcode

    Элемент панели инструментов, не отображающийся в форме xamarin

    У кого-нибудь есть примеры кода ECL Lisp для разработки Iphone?

    Давайте будем гением компьютера.