如何在 Swift 中使用 UserDefaults?

How can I use UserDefaults in Swift?

如何使用 UserDefaults 来 save/retrieve Swift 中的字符串、布尔值和其他数据?

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

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

参考: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: adds the registrationDictionary to the last item in every search list. This means that after NSUserDefaults has looked for a value in every other valid location, it will look in registered defaults, making them useful as a "fallback" value. Registered defaults are never stored between runs of an application, and are visible only to the application that registers them.

Default values from Defaults Configuration Files will automatically be registered.

例如从启动时检测应用程序,创建用于保存启动的结构

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 套件名称

另一个 属性 suite name, mostly its used for App Groups concept, the example scenario I taken from :

The use case is that I want to separate my UserDefaults (different business logic may require Userdefaults to be grouped separately) by an identifier just like Android's SharedPreferences. For example, when a user in my app clicks on logout button, I would want to clear his account related defaults but not location of the the device.

let user = UserDefaults(suiteName:"User")

use of userDefaults synchronize,详细信息已添加到重复答案中。

你可以这样在swift中使用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
}

最佳使用方式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 for Keys used to store data

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 指出的那样,它是不必要的,并给出了有关 it.Check 评论的文章以获取更多详细信息

我正常保存了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

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

在 class A 中,为键设置值:

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

在 class B 中,使用在 class 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()
    }
}

用于在 userdefaults 中存储一个值,

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

为了从 userdefaults 中检索值,

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)
class UserDefaults_FavoriteQuote {
    static let key = "appname.favoriteQuote"

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

我会说 非常好,但我必须在获取首选项时添加保护以使我的程序不会失败

这是 Swift 5

中的更新代码片段

Storing data in 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

    }

Fetching data from 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"))
    }

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

:)

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

我已经在 Userdefualts 中创建了用于存储数据的自定义函数

 //******************* REMOVE NSUSER DEFAULT *******************
 func removeUserDefault(key:String) {
  UserDefaults.standard.removeObject(forKey: key);
 }

 //******************* SAVE STRING IN USER DEFAULT *******************
 func saveInDefault(value:Any,key:String) {
  UserDefaults.standard.setValue(value, forKey: key);
  UserDefaults.standard.synchronize();
 }


//******************* FETCH STRING FROM USER DEFAULT *******************
func fetchString(key:String)->AnyObject {
if (UserDefaults.standard.object(forKey: key) != nil) {
    return UserDefaults.standard.value(forKey: key)! as AnyObject;
}
 else {
    return "" as AnyObject;
}
 }

使用 UserDefault 来存储您希望您的应用程序在启动之间记住的任何设置值,也许您想知道它之前是否启动过,也许您希望记住用户设置的一些值,这样他们就不会必须非常及时地设置,在 Mac windows 帧存储在那里,也许你想控制应用程序的行为,但你不希望它对最终用户可用,你只是想在你发布之前选择。请注意您在 UserDefaults 中存储的内容,它不受保护。