Работает ли UserDefaults.integer на 32-битных платформах? - PullRequest
1 голос
/ 07 марта 2020

Будет ли следующий код работать на 32-битных платформах?

class Account {
  private static let UserIDKey = "AccountUserIDKey"
  class var userID: Int64? {
    get { Int64(UserDefaults.standard.integer(forKey: UserIDKey)) }
    set { UserDefaults.standard.set(newValue, forKey: UserIDKey) }
  }
}

Ie, будет ли он работать на 32-битных платформах, если я сохраню и получу значение Int, которое больше Int32.max в UserDefaults?

Мне интересно, потому что я вижу только UserDefaults метод экземпляра integer(forKey:). Почему у UserDefaults нет метода экземпляра, подобного int64(forKey:)?

1 Ответ

0 голосов
/ 07 марта 2020

Вы можете сохранить ряд простых типов переменных в пользовательских значениях по умолчанию:

  • Booleans с Bool
  • integers с Int
  • floats с Float
  • doubles с Double
  • Strings с String
  • binary данные с Data
  • dates с Date
  • URLs с типом URL
  • Collection с типами Array и Dictionary

    Внутри класса UserDefaults могут храниться только классы NSData, NSString, NSNumber, NSDate, NSArray и NSDictionary.

    Это типы объектов, которые можно сохранить в списке свойств.

* NSNumber - это NSObject, который может содержать исходную цифру C в стиле c типы, которые даже включают тип C/Objective-C style BOOL (который хранит YES или NO). К счастью для нас, они также соединены со Swift, поэтому для программы Swift NSNumber может автоматически принимать следующие типы Swift:

  • UInt
  • Int
  • Float
  • Double
  • Bool

Ответ Дмитрия Попова в Quora

Вспомните, как вас учили в школе, как добавлять числа, такие как 38 и 54. Вы работаете с отдельными цифрами. Вы берете самые правые цифры 8 и 4, добавляете их, получаете ответ di git 2 и 1 переносите из-за переполнения. Вы берете вторые цифры 3 и 5, добавляете их, чтобы получить 8, и добавляете переносимый 1, чтобы получить результат 9, так что весь ответ становится 92. 32-разрядный процессор делает то же самое, но вместо десятичных цифр он получает 32 -битные целые числа, алгоритмы одинаковы: работают с двумя 32-разрядными частями 64-разрядного числа отдельно, справляются с переполнениями путем переноса из нижнего в старшее слово. Это требует нескольких 32-битных инструкций, и компилятор отвечает за их правильное кодирование.


Сохранение Int64 до UserDefaults

import Foundation

let defaults = UserDefaults.standart

//Define an 64bit integer with `Int64`
let myInteger: Int64 = 1000000000000000

//Save the integer to `UserDefaults`
defaults.set(myInteger, forKey: "myIntegerKey")

// Get the saved value from `UserDefaults`
guard let savedInteger = defaults.object(forKey: "myIntegerKey") as? Int64 else { return }

print("my 64bit integer is:", savedInteger)

Сохранение 64 бит Int в UserDefaults путем преобразования в String

let myInteger: Int64 = 1000000000000000
let myString = String(myInteger)

//Save the `myString` to `UserDefaults`
UserDefaults.standard.set(myString, forKey: "myIntegerKey")


// Get the value from `UserDefaults`
let myString = UserDefaults.standard.string(forKey: "myIntegerKey")
let myInteger = Int64(myString!)

Ресурсы

...