如何在 Swift 中使用 UserDefault?

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

209395 次浏览
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")


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

档号: NSUserdefault objectType

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


登记册

RegisterDefault: 将 registrationDictionary 添加到每个搜索列表中的最后一项。这意味着在 NSUserDefault 在每个其他有效位置查找值之后,它将查找已注册的默认值,这使它们作为“回退”值非常有用。已注册的默认值从不存储在应用程序的运行之间,而且只对注册它们的应用程序可见。

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

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

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
}

UserDefault 套件名称

另一个属性 套房名称,主要用于 应用程序群组概念,这是我从 给你获得的示例场景:

这个用例是我想用一个标识符来分离我的 UserDefault (不同的业务逻辑可能需要 Userdefault 被单独分组) ,就像 Android 的 SharedPreferences 一样。例如,当一个用户在我的应用程序点击注销按钮,我想清除他的帐户相关的默认值,但不位置的设备。

let user = UserDefaults(suiteName:"User")

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

你可以这样快速地使用 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
}

使用 用户默认值的最佳方法

步骤

  1. 创建 UserDefault 的扩展
  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
}

在需要的位置保存 UserDefault

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)

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

更新 不需要使用 synize ()来存储值。正如@Moritz 指出的那样,这是没有必要的,并给出了相关的文章。查看评论以了解更多细节

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

斯威夫特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")

在类 A中,为键设置值:

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

在类 B中,使用类 A中声明的键获取文本的值,并将其分配给您需要的相应变量:

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

斯威夫特4号, 我使用 Enum 来处理 UserDefault。

这只是一个示例代码,您可以根据自己的需求对其进行定制。

用于存储,检索,删除。 这样,只需将 UserDefault 键的键添加到枚举中。 根据 dataType 和您的需求获取和存储值时处理值。

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

为了从 userdefault 中检索值,

//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中更新的代码片段

在 UserDefault 中存储数据

@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


}

从 UserDefault 获取数据

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

迅捷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 窗口框架存储在那里为你,也许你想控制应用程序的行为,但你不想它可用于最终用户,你只是想在你的发布之前选择。小心存储在 UserDefault 中的内容,它不受保护。