Швидкий 5+
Жодна з відповідей насправді детально не охоплює стандартні можливості зберігання за замовчуванням. Це може зробити набагато більше, ніж просто рядки.
У документації щодо яблук є наступні параметри для отримання "даних" за замовчуванням.
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")
Що цікаво для одного з Getters, це DictionaryRepresentation , цей зручний інструмент візьме всі ваші типи даних незалежно від того, що вони є, і помістить їх у приємний словник, до якого ви можете отримати доступ за своїм ім'ям рядка та вказати правильний відповідний тип даних, коли ви запитаєте він повертається назад, оскільки має тип "будь-який" .
Ви також можете зберігати свої власні класи та об’єкти, використовуючи, відповідно, func set(Any?, forKey: String)
і func object(forKey: String) -> Any?
setter, і getter.
Сподіваємось, це ще більше пояснює потужність класу UserDefaults для зберігання локальних даних.
На замітку про те, скільки ви повинні зберігати і як часто, Hardy_Germany дав хорошу відповідь на це у цій публікації , ось цитата з нього
Як уже згадувалося багато людей: я не знаю жодного обмеження SIZE (крім фізичної пам'яті) для зберігання даних у .plist (наприклад, UserDefaults). Тож це не питання СКІЛЬКО.
Справжнє запитання повинно бути ЯК ВЗАГАЛЬНО ви пишете нові / змінені значення ... І це пов’язано зі спорядженням акумулятора, яке це запит спричинить.
IOS не має шансів уникнути фізичного запису на "диск", якщо змінено одне значення, просто щоб зберегти цілісність даних. Що стосується UserDefaults, це спричиняє весь файл, записаний на диск.
Це дозволяє активувати "диск" і тримати його живлення довше, а також запобігає переходу IOS на стан низької потужності.
Щось ще слід зазначити, як згадував користувач Mohammad Reza Farahani з цієї публікації, - це асинхронний та синхронний характер userDefaults.
Коли ви встановлюєте значення за замовчуванням, воно змінюється синхронно в межах вашого процесу та асинхронно для постійного зберігання та інших процесів.
Наприклад, якщо ви зберігаєте та швидко закриваєте програму, ви можете помітити, що вона не зберігає результати, це тому, що вона зберігається асинхронно. Ви, можливо, не помічаєте цього весь час, тому якщо ви плануєте економити перед тим, як вийти з програми, можливо, ви захочете це врахувати, надавши їй деякий час для завершення.
Можливо, у когось є приємні рішення для цього, якими вони можуть поділитися в коментарях?