ios 如何在 Swift 中使用 UserDefaults?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31203241/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 06:42:35  来源:igfitidea点击:

How can I use UserDefaults in Swift?

iosswiftnsuserdefaultsuserdefaults

提问by Mithun Ravindran

How can I use UserDefaults to save/retrieve strings, booleans and other data in Swift?

如何使用 UserDefaults 在 Swift 中保存/检索字符串、布尔值和其他数据?

回答by Anbu.Karthik

ref: NSUserdefault objectTypes

参考:NSUserdefault objectTypes

Swift 3 and above

Swift 3 及以上

Store

店铺

UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key")  //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject

Retrieve

取回

 UserDefaults.standard.bool(forKey: "Key")
 UserDefaults.standard.integer(forKey: "Key")
 UserDefaults.standard.string(forKey: "Key")

Remove

消除

 UserDefaults.standard.removeObject(forKey: "Key")

Remove all Keys

删除所有键

 if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
 }

Swift 2 and below

Swift 2 及以下

Store

店铺

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

Retrieve

取回

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

Remove

消除

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



Register登记

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.

registerDefaults:将 registrationDictionary 添加到每个搜索列表中的最后一项。这意味着在 NSUserDefaults 在所有其他有效位置查找值后,它将查找已注册的默认值,使它们可用作“后备”值。注册的默认值永远不会在应用程序运行之间存储,并且仅对注册它们的应用程序可见。

默认配置文件中的默认值将自动注册。

for example detect the app from launch , create the struct for save launch

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

struct DetectLaunch {
static let keyforLaunch = "validateFirstlunch"
static var isFirst: Bool {
    get {
        return UserDefaults.standard.bool(forKey: keyforLaunch)
    }
    set {
        UserDefaults.standard.set(newValue, forKey: keyforLaunch)
    }
}
}

Register default values on app launch:

在应用程序启动时注册默认值:

UserDefaults.standard.register(defaults: [
        DetectLaunch.isFirst: true
    ])

remove the value on app termination:

删除应用程序终止时的值:

func applicationWillTerminate(_ application: UIApplication) {
    DetectLaunch.isFirst = false

}

and check the condition as

并检查条件为

if DetectLaunch.isFirst {
  // app launched from first
}


UserDefaults suite name

UserDefaults 套件名称

another one property suite name, mostly its used for App Groups concept, the example scenario I taken from here:

另一个属性套件名称,主要用于 App Groups 概念,我从这里获取的示例场景:

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.

用例是我想通过一个标识符来分隔我的 UserDefaults(不同的业务逻辑可能需要分别对 Userdefaults 进行分组),就像 Android 的 SharedPreferences 一样。例如,当我的应用程序中的用户单击注销按钮时,我想清除他的帐户相关默认值,而不是设备的位置。

let user = UserDefaults(suiteName:"User")

use of userDefaults synchronize, the detail info has added in the duplicate answer.

使用 userDefaults synchronize,详细信息已添加到重复的答案中。

回答by iSrinivasan27

Best way to use UserDefaults

使用UserDefaults 的最佳方式

Steps

脚步

  1. Create extension of UserDefaults
  2. Create enum with required Keys to store in local
  3. Store and retrieve the local data wherever you want
  1. 创建 UserDefaults 的扩展
  2. 创建具有所需密钥的枚举以存储在本地
  3. 随时随地存储和检索本地数据

Sample

样本

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

enumfor Keys used to store data

用于存储数据的键的枚举

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}

Save in UserDefaultswhere you want

将 UserDefaults 保存在您想要的位置

UserDefaults.standard.setLoggedIn(value: true)          // String
UserDefaults.standard.setUserID(value: result.User.id!) // String

Retrieve dataanywhere in app

在应用程序中的任何位置检索数据

print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()

Remove Values

删除值

UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID) 

This way you can store primitive data in best

这样您就可以最好地存储原始数据

UpdateYou need no use synchronize() to store the values. As @Moritz pointed out the it unnecessary and given the article about it.Check comments for more detail

更新您不需要使用同步()来存储值。正如@Moritz 指出这是不必要的,并给出了关于它的文章。查看评论以获取更多详细信息

回答by Nikunj Joshi

Swift 4:

斯威夫特 4

Store

店铺

    UserDefaults.standard.set(object/value, forKey: "key_name")

Retrive

检索

    var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]

Remove

消除

    UserDefaults.standard.removeObject(forKey:"key_name") 

回答by Dharmesh Kheni

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

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

回答by DHEERAJ

You can use NSUserDefaultsin swift this way,

您可以通过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
}

回答by Xab Ion

Swift 5 and above:

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

:)

:)

回答by Mannam Brahmam

UserDefault+Helper.swift

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

Usage:

用法:

Save Value:

保存价值:

UserDefaultHelper.userloginId = data["user_id"] as? String

Fetch Value:

取值:

let userloginid = UserDefaultHelper.userloginId

Delete Value:

删除值:

UserDefaultHelper.deleteUserLoginId()

回答by neoneye

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

回答by swiftBoy

I would say Anbu's answerperfectly fine but I had to add guard while fetching preferences to make my program doesn't fail

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

Here is the updated code snip in Swift 5

这是Swift 5 中更新的代码片段

Storing data in UserDefaults

在 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

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

回答by Chandni

I saved NSDictionary normally and able to get it correctly.

我正常保存了 NSDictionary 并且能够正确获取它。

 dictForaddress = placemark.addressDictionary! as NSDictionary
        let userDefaults = UserDefaults.standard
        userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)

// For getting data from NSDictionary.

// 用于从 NSDictionary 获取数据。

let userDefaults = UserDefaults.standard
    let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary