Як я можу використовувати UserDefaults для збереження / отримання рядків, булевих та інших даних у Swift?
Як я можу використовувати UserDefaults для збереження / отримання рядків, булевих та інших даних у Swift?
Відповіді:
Магазин
UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key") //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject
Витягнути
UserDefaults.standard.bool(forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
UserDefaults.standard.string(forKey: "Key")
Видалити
UserDefaults.standard.removeObject(forKey: "Key")
Видаліть усі ключі
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Магазин
NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()
Витягнути
var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]
Видалити
NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")
registerDefaults: додає DictionaryDectory до останнього елемента у кожному списку пошуку. Це означає, що після того, як NSUserDefaults шукає значення у всіх інших дійсних місцях, воно буде шукати зареєстровані за замовчуванням, що робить їх корисними як значення "резервного". Зареєстровані за замовчуванням ніколи не зберігаються між запусками програми та є видимими лише для програми, яка їх реєструє.
Значення за замовчуванням у файлах конфігурації за замовчуванням автоматично реєструються.
наприклад виявити додаток від запуску, створити структуру для запуску збереження
struct DetectLaunch {
static let keyforLaunch = "validateFirstlunch"
static var isFirst: Bool {
get {
return UserDefaults.standard.bool(forKey: keyforLaunch)
}
set {
UserDefaults.standard.set(newValue, forKey: keyforLaunch)
}
}
}
Зареєструйте значення за замовчуванням при запуску програми:
UserDefaults.standard.register(defaults: [
DetectLaunch.isFirst: true
])
видаліть значення після завершення програми:
func applicationWillTerminate(_ application: UIApplication) {
DetectLaunch.isFirst = false
}
і перевірити стан як
if DetectLaunch.isFirst {
// app launched from first
}
ще одне ім’я набору властивостей , в основному його використовується для концепції груп груп , приклад сценарію я взяв звідси :
Випадок використання полягає в тому, що я хочу відокремити свої UserDefaults (різні бізнес-логіки можуть вимагати, щоб Userdefaults були згруповані окремо) ідентифікатором так само, як і SharedPreferences Android. Наприклад, коли користувач у моїй програмі натискає кнопку виходу, я б хотів очистити типові за замовчуванням, які стосуються його облікового запису, але не місцезнаходження пристрою.
let user = UserDefaults(suiteName:"User")
використання синхронізації користувачаDefaults , інформація про деталі додана у відповідь дубліката.
Найкращий спосіб використання UserDefaults
Кроки
Зразок
extension UserDefaults{
//MARK: Check Login
func setLoggedIn(value: Bool) {
set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)
//synchronize()
}
func isLoggedIn()-> Bool {
return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)
}
//MARK: Save User Data
func setUserID(value: Int){
set(value, forKey: UserDefaultsKeys.userID.rawValue)
//synchronize()
}
//MARK: Retrieve User Data
func getUserID() -> Int{
return integer(forKey: UserDefaultsKeys.userID.rawValue)
}
}
перерахунок для ключів, які використовуються для зберігання даних
enum UserDefaultsKeys : String {
case isLoggedIn
case userID
}
Збережіть у UserDefaults, де ви хочете
UserDefaults.standard.setLoggedIn(value: true) // String
UserDefaults.standard.setUserID(value: result.User.id!) // String
Отримайте дані будь-де в додатку
print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()
Видалити значення
UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID)
Таким чином ви зможете найкраще зберігати примітивні дані
Оновлення Вам не потрібно використовувати синхронізацію () для зберігання значень. Як @Moritz вказав на непотрібність і надав статтю про це, перегляньте коментарі для більш детальної інформації
synchronize()
, це пояснено в документації. Тут не тільки марно, але й може уповільнити доступ за замовчуванням.
Швидкий 4 :
Магазин
UserDefaults.standard.set(object/value, forKey: "key_name")
Поверніться
var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]
Видалити
UserDefaults.standard.removeObject(forKey:"key_name")
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
Ви можете NSUserDefaults
швидко використовувати цей спосіб,
@IBAction func writeButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("defaultvalue", forKey: "userNameKey")
}
@IBAction func readButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
let name = defaults.stringForKey("userNameKey")
println(name) //Prints defaultvalue in console
}
synchronize()
команду для того, NSUserDefaults
щоб переконатися, що ваші речі збережені після блоку змін. Це могло б бути більш необхідним в iOS 7 і новіших версіях, але в iOS 8 і далі не слід викликати синхронізацію () у більшості ситуацій. Перевірте це для отримання додаткової інформації: codingexplorer.com/nsuserdefaults-a-swift-introduction
Швидкий рух 5 і вище:
let defaults = UserDefaults.standard
defaults.set(25, forKey: "Age")
let savedInteger = defaults.integer(forKey: "Age")
defaults.set(true, forKey: "UseFaceID")
let savedBoolean = defaults.bool(forKey: "UseFaceID")
defaults.set(CGFloat.pi, forKey: "Pi")
defaults.set("Your Name", forKey: "Name")
defaults.set(Date(), forKey: "LastRun")
let array = ["Hello", "World"]
defaults.set(array, forKey: "SavedArray")
let savedArray = defaults.object(forKey: "SavedArray") as? [String] ?? [String()
let dict = ["Name": "Your", "Country": "YourCountry"]
defaults.set(dict, forKey: "SavedDict")
let savedDictionary = defaults.object(forKey: "SavedDictionary") as? [String: String] ?? [String: String]()
:)
Я нормально зберігав NSDictionary і міг правильно його отримати.
dictForaddress = placemark.addressDictionary! as NSDictionary
let userDefaults = UserDefaults.standard
userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)
// Для отримання даних з NSDictionary.
let userDefaults = UserDefaults.standard
let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary
class UserDefaults_WorstPresidentName {
static let key = "appname.worstPresidentName"
static var value: String? {
get {
return UserDefaults.standard.string(forKey: key)
}
set {
if newValue != nil {
UserDefaults.standard.set(newValue, forKey: key)
} else {
UserDefaults.standard.removeObject(forKey: key)
}
}
}
}
UserDefault + Helper.swift
import UIKit
private enum Defaults: String {
case countryCode = "countryCode"
case userloginId = "userloginid"
}
final class UserDefaultHelper {
static var countryCode: String? {
set{
_set(value: newValue, key: .countryCode)
} get {
return _get(valueForKay: .countryCode) as? String ?? ""
}
}
static var userloginId: String? {
set{
_set(value: newValue, key: .userloginId)
} get {
return _get(valueForKay: .userloginId) as? String ?? ""
}
}
private static func _set(value: Any?, key: Defaults) {
UserDefaults.standard.set(value, forKey: key.rawValue)
}
private static func _get(valueForKay key: Defaults)-> Any? {
return UserDefaults.standard.value(forKey: key.rawValue)
}
static func deleteCountryCode() {
UserDefaults.standard.removeObject(forKey: Defaults.countryCode.rawValue)
}
static func deleteUserLoginId() {
UserDefaults.standard.removeObject(forKey: Defaults.userloginId.rawValue)
}
}
Використання:
Зберегти значення:
UserDefaultHelper.userloginId = data["user_id"] as? String
Отримати значення:
let userloginid = UserDefaultHelper.userloginId
Видалити значення:
UserDefaultHelper.deleteUserLoginId()
Я б сказав , що відповідь Анбу ідеально чудова, але мені довелося додати охорону під час отримання переваг, щоб моя програма не вийшла з ладу
Ось оновлений фрагмент коду у Swift 5
Зберігання даних у UserDefaults
@IBAction func savePreferenceData(_ sender: Any) {
print("Storing data..")
UserDefaults.standard.set("RDC", forKey: "UserName") //String
UserDefaults.standard.set("TestPass", forKey: "Passowrd") //String
UserDefaults.standard.set(21, forKey: "Age") //Integer
}
Отримання даних з UserDefaults
@IBAction func fetchPreferenceData(_ sender: Any) {
print("Fetching data..")
//added guard
guard let uName = UserDefaults.standard.string(forKey: "UserName") else { return }
print("User Name is :"+uName)
print(UserDefaults.standard.integer(forKey: "Age"))
}
В класі A
встановіть значення для ключа:
let text = "hai"
UserDefaults.standard.setValue(text, forKey: "textValue")
У класі B
отримайте значення для тексту, використовуючи ключ, який оголосив у класі, A
і призначте його відповідної змінної, яка вам потрібна:
var valueOfText = UserDefaults.value(forKey: "textValue")
Swift 4, я використовував Enum для обробки UserDefaults.
Це лише зразок коду. Ви можете налаштувати його відповідно до своїх вимог.
Для зберігання, пошуку, видалення. Таким чином просто додайте до перерахунку ключ для вашого ключа UserDefaults. Обробляйте значення під час отримання та зберігання відповідно до типу типу даних та вашим вимогам.
enum UserDefaultsConstant : String {
case AuthToken, FcmToken
static let defaults = UserDefaults.standard
//Store
func setValue(value : Any) {
switch self {
case .AuthToken,.FcmToken:
if let _ = value as? String {
UserDefaults.standard.set(value, forKey: self.rawValue)
}
break
}
UserDefaults.standard.synchronize()
}
//Retrieve
func getValue() -> Any? {
switch self {
case .AuthToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) != nil) {
return "Bearer "+(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) as! String)
}
else {
return ""
}
case .FcmToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) != nil) {
print(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue))
return (UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) as! String)
}
else {
return ""
}
}
}
//Remove
func removeValue() {
UserDefaults.standard.removeObject(forKey: self.rawValue)
UserDefaults.standard.synchronize()
}
}
Щоб зберегти значення у налаштуваннях користувача,
if let authToken = resp.data?.token {
UserDefaultsConstant.AuthToken.setValue(value: authToken)
}
Щоб отримати значення з налаштувань користувача,
//As AuthToken value is a string
(UserDefaultsConstant.AuthToken.getValue() as! String)