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
How can I use UserDefaults in Swift?
提问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
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
脚步
- Create extension of UserDefaults
- Create enum with required Keys to store in local
- Store and retrieve the local data wherever you want
- 创建 UserDefaults 的扩展
- 创建具有所需密钥的枚举以存储在本地
- 随时随地存储和检索本地数据
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 NSUserDefaults
in 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