如何在Swift中使用UserDefaults?


118

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


4
我重新提出这个问题,因为它可以作为有关此主题的一个很好的一般性问题。接受的答案也比之前的标记重复项更清晰,后者也比该问题更具体。
Suragch '17


我认为这个问题在堆栈溢出中是可用的,您应该先搜索然后在此处添加问题
Yogesh Patel

Answers:


329

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

另一个属性套件名称,主要用于 App Groups概念,这是我从此处获取的示例方案:

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

let user = UserDefaults(suiteName:"User")

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


您应该在何时何地调用store方法?在应用程序关闭之前还是每次值更改时?
josef

非常棒,可以进行各种操作。
迈克尔·彼得森

@ Anbu.Karthik您将如何更新userdefaults中某个键的值?
sathya chinnasamy

2
@RajeshBaidya-userdefault始终仅存储最终值
Anbu.Karthik,

这些数据是否可以通过应用安装/卸载持续存在?
OrangePot

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) 

这样,您可以最佳地存储原始数据

更新 您不需要使用syncnize()来存储值。正如@Moritz指出的那样,它是不必要的,并提供了有关它的文章。查看评论以获取更多详细信息


您不需要synchronize(),在文档中对其进行了说明。它不仅在这里没有用,而且会减慢默认访问权限。
Eric Aya

是的,它在文档中提到。更改默认数据后,它将自动保存,但在某些情况下,您的值可能不会存储,即异步。所以我认为最好同步。
iSrinivasan27

2
这并不好-有时甚至是问题的根源。不要使用同步,它已过时且有问题。请参阅codingexplorer.com/nsuserdefaults-a-swift-introduction,尤其是“更新”部分。我还对此进行了许多测试,并删除了所有要在我所有应用程序中同步的呼叫,即使在严峻的情况下也从未遇到问题。但是,嘿,如果您喜欢无用的东西,这些东西可能会使您的应用程序减速,请致电同步...确定...;)
Eric Aya

真的很有帮助。我评论了sync()。根据需要使用sync()。
iSrinivasan27 '18

hii如何将数据以nsuserdefaults的形式快速保存在单独的文件中
Dilip Tiwari

15

斯威夫特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
Nishad Arora

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

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

在Swift 3中:让分钟= UserDefaults.standard.object(forKey:“分钟”)为!琴弦
亚历山德罗·马蒂兹

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及更高版本中,在大多数情况下,您不应调用syncnize()。 检查此以获得更多信息:codingexplorer.com/nsuserdefaults-a-swift-introduction
Dharmesh Kheni

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

谢谢您的帮助,小姐。:)
Venkatesh

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

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

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

在class中B,使用在class中声明的键获取文本的值,并将其A分配给所需的各个变量:

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

0

Swift 4,我使用Enum处理UserDefaults。

这只是一个示例代码。您可以根据需要自定义它。

用于存储,检索,移除。这样,只需将您的UserDefaults键的键添加到枚举即可。根据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()
    }
}

为了将值存储在userdefaults中,

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

要从userdefaults检索值,

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.