Свифт 5+
Ни один из ответов на самом деле подробно не описывает встроенные возможности локального хранилища по умолчанию. Это может сделать гораздо больше, чем просто строки.
У вас есть следующие опции прямо из документации Apple для «получения» данных по умолчанию.
func object(forKey: String) -> Any?
//Returns the object associated with the specified key.
func url(forKey: String) -> URL?
//Returns the URL associated with the specified key.
func array(forKey: String) -> [Any]?
//Returns the array associated with the specified key.
func dictionary(forKey: String) -> [String : Any]?
//Returns the dictionary object associated with the specified key.
func string(forKey: String) -> String?
//Returns the string associated with the specified key.
func stringArray(forKey: String) -> [String]?
//Returns the array of strings associated with the specified key.
func data(forKey: String) -> Data?
//Returns the data object associated with the specified key.
func bool(forKey: String) -> Bool
//Returns the Boolean value associated with the specified key.
func integer(forKey: String) -> Int
//Returns the integer value associated with the specified key.
func float(forKey: String) -> Float
//Returns the float value associated with the specified key.
func double(forKey: String) -> Double
//Returns the double value associated with the specified key.
func dictionaryRepresentation() -> [String : Any]
//Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.
Вот варианты «настройки»
func set(Any?, forKey: String)
//Sets the value of the specified default key.
func set(Float, forKey: String)
//Sets the value of the specified default key to the specified float value.
func set(Double, forKey: String)
//Sets the value of the specified default key to the double value.
func set(Int, forKey: String)
//Sets the value of the specified default key to the specified integer value.
func set(Bool, forKey: String)
//Sets the value of the specified default key to the specified Boolean value.
func set(URL?, forKey: String)
//Sets the value of the specified default key to the specified URL.
Если вы храните такие вещи, как настройки, а не большой набор данных, это идеальный вариант.
Двойной пример :
Установка:
let defaults = UserDefaults.standard
var someDouble:Double = 0.5
defaults.set(someDouble, forKey: "someDouble")
Получение:
let defaults = UserDefaults.standard
var someDouble:Double = 0.0
someDouble = defaults.double(forKey: "someDouble")
Что интересно в одном из методов получения, так это словарь dictionaryRepresentation , этот удобный метод получения возьмет все ваши типы данных независимо от того, какие они есть, и поместит их в хороший словарь, к которому вы можете получить доступ по его имени строки, и даст правильный соответствующий тип данных, когда вы запрашиваете это назад, так как это типа «любой» .
Вы можете хранить свои собственные классы и объекты, также используя func set(Any?, forKey: String)
и func object(forKey: String) -> Any?
setter и getter соответственно.
Надеюсь, что это проясняет возможности класса UserDefaults для хранения локальных данных.
На заметку о том, сколько вы должны хранить и как часто, Hardy_Germany дал хороший ответ на этот вопрос в этом посте , вот цитата из него
Как уже упоминалось, я не знаю каких-либо ограничений размера (кроме физической памяти) для хранения данных в .plist (например, UserDefaults). Так что это не вопрос, сколько.
Реальный вопрос должен заключаться в том, КАК ЧАСТО вы пишете новые / измененные значения ... И это связано с разрядкой батареи, которая вызывает эти записи.
У IOS нет шансов избежать физической записи на «диск» при изменении одного значения, просто чтобы сохранить целостность данных. Относительно UserDefaults это вызывает перезапись всего файла на диск.
Это включает «диск» и поддерживает его в течение более длительного времени и предотвращает переход IOS в режим низкого энергопотребления.
Еще одно замечание, упомянутое пользователем Мохаммадом Реза Фарахани из этого поста, - это асинхронный и синхронный характер userDefaults.
Когда вы устанавливаете значение по умолчанию, оно изменяется синхронно внутри вашего процесса и асинхронно с постоянным хранилищем и другими процессами.
Например, если вы сохраняете и быстро закрываете программу, вы можете заметить, что она не сохраняет результаты, это потому, что она сохраняется асинхронно. Вы можете не замечать этого все время, поэтому, если вы планируете сохранить перед выходом из программы, вы можете отнести это к учету, предоставив ему некоторое время для завершения.
Может быть, у кого-то есть хорошие решения для этого, которыми они могут поделиться в комментариях?