Як я можу використовувати UserDefaults в Swift?


119

Як я можу використовувати UserDefaults для збереження / отримання рядків, булевих та інших даних у Swift?


4
Я знову відкриваю це питання, оскільки воно може слугувати гарним загальним питанням на цю тему. Прийнята відповідь також більш чітка, ніж попередній позначений дублікат , який також був більш конкретним, ніж це питання.
Сурагч


Я думаю, що це запитання доступне в переповненні стека, який ви повинні шукати, перш ніж додати питання тут
Yogesh Patel

Відповіді:


330

ref: NSUserdefault typeTypes

Швидкість 3 і вище

Магазин

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)
 }

Швидкий рух 2 і нижче

Магазин

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 (різні бізнес-логіки можуть вимагати, щоб Userdefaults були згруповані окремо) ідентифікатором так само, як і SharedPreferences Android. Наприклад, коли користувач у моїй програмі натискає кнопку виходу, я б хотів очистити типові за замовчуванням, які стосуються його облікового запису, але не місцезнаходження пристрою.

let user = UserDefaults(suiteName:"User")

використання синхронізації користувачаDefaults , інформація про деталі додана у відповідь дубліката.


Коли і де слід викликати магазинні методи? Незадовго до того, як програма закриється чи кожного разу змінюються значення?
josef

досить приголомшливо, одне місце для різного роду операцій.
Майкл Петерсон

@ Anbu.Karthik, як ви оновите значення для ключа у налаштуваннях користувача?
sathya chinnasamy

2
@RajeshBaidya - користувач за замовчуванням завжди зберігає лише остаточне значення
Anbu.Karthik,

Чи зберігаються ці дані через встановлення / видалення додатків?
OrangePot

40

Найкращий спосіб використання UserDefaults

Кроки

  1. Створіть розширення UserDefaults
  2. Створіть перелік із необхідними клавішами для зберігання в локальному
  3. Зберігайте та отримуйте місцеві дані там, де ви хочете

Зразок

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(), це пояснено в документації. Тут не тільки марно, але й може уповільнити доступ за замовчуванням.
Ерік Айя

Так, це згадується в док. Після зміни даних за замовчуванням вони зберігаються автоматично, але в деяких випадках ваші значення можуть не зберігатися, тобто асинхронні. Тому я подумав, що краще синхронізувати.
iSrinivasan27

2
Це не краще - це іноді навіть джерело питань. Не використовуйте синхронізацію, це застаріло і проблематично. Дивіться codingexplorer.com/nsuserdefaults-a-swift-introduction, зокрема частину "оновлення". Я також провів багато тестів з цього приводу і видалив усі дзвінки для синхронізації у всіх моїх програмах, і жодного разу не виникло проблем навіть у важких ситуаціях. Але ей, якщо вам подобаються непотрібні речі, які можуть уповільнити ваш додаток, зателефонуйте синхронізуйте ... обов'язково ...;)
Ерік Айя

Це дуже корисно. Я прокоментував sync (). Використання sync () базується на необхідності.
iSrinivasan27

привіт, як зберегти дані в nsuserdefaults в окремому файлі в швидкому режимі
Діліп Тіварі

15

Швидкий 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") 

що ви маєте на увазі під цим рядком "UserDefaults.standard.synchronize ()" як необов'язковий? @NikunjJoshi
Nishad Arora

2
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")

//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")

У Swift 3: нехай хвилини = UserDefaults.standard.object (forKey: "хвилини") як! Рядок
Алессандро Маттюцці

2

Ви можете 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
}

2
У першій версії цього допису сказано, що використовує synchronize()команду для того, NSUserDefaultsщоб переконатися, що ваші речі збережені після блоку змін. Це могло б бути більш необхідним в iOS 7 і новіших версіях, але в iOS 8 і далі не слід викликати синхронізацію () у більшості ситуацій. Перевірте це для отримання додаткової інформації: codingexplorer.com/nsuserdefaults-a-swift-introduction
Dharmesh Kheni

2

Швидкий рух 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]()

:)


1

Я нормально зберігав 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

Дякую за допомогу, міс. :)
Венкатеш

1
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)
            }
        }
    }
}

1

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()

1

Я б сказав , що відповідь Анбу ідеально чудова, але мені довелося додати охорону під час отримання переваг, щоб моя програма не вийшла з ладу

Ось оновлений фрагмент коду у 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"))
    }

0

В класі Aвстановіть значення для ключа:

let text = "hai"  
UserDefaults.standard.setValue(text, forKey: "textValue")

У класі Bотримайте значення для тексту, використовуючи ключ, який оголосив у класі, Aі призначте його відповідної змінної, яка вам потрібна:

var valueOfText  = UserDefaults.value(forKey: "textValue")

0

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.