Как я могу использовать UserDefaults в Swift?


119

Как я могу использовать UserDefaults для сохранения / извлечения строк, логических и других данных в Swift?


4
Я снова открываю этот вопрос, потому что он может служить хорошим общим вопросом по этой теме. Принятый ответ также более ясен, чем предыдущий отмеченный дубликат , который также был более конкретным, чем этот вопрос.
Suragch


Я думаю, что этот вопрос доступен в переполнении стека, вы должны поискать, прежде чем добавлять здесь вопрос
Йогеш Патель

Ответы:


331

ссылка: NSUserdefault objectTypes

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

Swift 2 и ниже

хранить

NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()

Получить

  var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]

удалять

 NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")


регистр

registerDefaults: добавляет словарь registrationDictionary к последнему элементу в каждом списке поиска. Это означает, что после того, как 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")

использование синхронизации userDefaults , подробная информация добавлена ​​в повторяющийся ответ.


Когда и где следует вызывать методы магазина? Непосредственно перед закрытием приложения или каждый раз при изменении значений?
йозеф

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

@ Anbu.Karthik, как вы обновите значение ключа в userdefaults?
sathya chinnasamy

2
@RajeshBaidya - userdefault всегда сохраняет только окончательное значение
Anbu.Karthik

Сохраняются ли эти данные при установке / удалении приложения?
OrangePot 05

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) 

Таким образом, вы можете хранить примитивные данные наилучшим образом.

Обновление. Для хранения значений не нужно использовать функцию synchronize (). Как @Moritz указал на ненужность и дал статью об этом. Подробнее читайте в комментариях.


Вам не нужно synchronize(), это объяснено в документации. Это не только бесполезно, но и может замедлить доступ к настройкам по умолчанию.
Эрик Айя

Да, это упоминается в док. После изменения данных по умолчанию они сохранятся автоматически, но в некоторых случаях ваши значения могут не сохраняться, например, асинхронно. Поэтому я подумал, что лучше синхронизировать.
iSrinivasan27

2
Это не лучше - иногда это даже источник проблем. Не используйте синхронизацию, она устарела и проблематична. См. Codingexplorer.com/nsuserdefaults-a-swift-introduction, особенно часть «обновление». Я также провел много тестов по этому поводу и удалил все вызовы синхронизации во всех своих приложениях, и у меня никогда не было проблем даже в ужасных ситуациях. Но послушайте, если вам нравятся бесполезные вещи, которые могут замедлить работу вашего приложения, синхронизация вызовов ... конечно ...;)
Эрик Айя

Это действительно полезно. Я прокомментировал sync (). Использование sync () зависит от необходимости.
iSrinivasan27

hii как сохранить данные в nsuserdefaults в отдельном файле в Swift
Дилип Тивари

15

Swift 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
Арора


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 и более поздних версиях вам не следует вызывать synchronize () в большинстве ситуаций. Проверьте это для получения дополнительной информации: codingexplorer.com/nsuserdefaults-a-swift-introduction
Дхармеш Хени

2

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

Для сохранения значения в userdefaults,

if let authToken = resp.data?.token {
     UserDefaultsConstant.AuthToken.setValue(value: authToken)
    }

Чтобы получить значение из userdefaults,

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.