【问题标题】:How can I use UserDefaults in Swift?如何在 Swift 中使用 UserDefaults?
【发布时间】:2015-09-21 02:02:17
【问题描述】:

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

【问题讨论】:

  • 我重新提出这个问题是因为它可以作为关于这个主题的一个很好的一般性问题。接受的答案也比previous marked duplicate 更清楚,这也比这个问题更具体。
  • 我认为这个问题在堆栈溢出中可用,您应该在此处添加问题之前搜索

标签: ios swift nsuserdefaults userdefaults


【解决方案1】:

我在 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;
}
 }

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        另一个属性suite name,主要用于App Groups concept,我取自here的示例场景:

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

        let user = UserDefaults(suiteName:"User")
        

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

        【讨论】:

        • 应该在何时何地调用 store 方法?就在应用关闭之前或每次值更改时?
        • 非常棒,各种操作都在一处。
        • @Anbu.Karthik 你将如何更新 userdefaults 中键的值?
        • @RajeshBaidya - userdefault 始终只存储最终值
        • 此数据是否会在应用安装/卸载过程中持续存在?
        【解决方案5】:

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

        :)

        【讨论】:

        • 你必须结束“savedArray”的关闭
        【解决方案6】:

        使用 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) 
        

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

        更新 您无需使用 synchronize() 来存储值。正如@Moritz 指出的那样,这是不必要的,并给出了关于它的文章。查看 cmets 了解更多详情

        【讨论】:

        • 你不需要synchronize(),它在文档中有解释。这不仅在这里没用,而且可能会减慢默认访问速度。
        • 是的,文档中提到了。更改默认数据后,它将自动保存,但在某些情况下,您的值可能不会存储,即异步。所以我认为最好同步。
        • 这不是更好 - 它有时甚至是问题的根源。不要使用同步,它已经过时且有问题。请参阅codingexplorer.com/nsuserdefaults-a-swift-introduction,尤其是“更新”部分。我还对此进行了许多测试,并删除了我所有应用程序中的所有同步调用,即使在可怕的情况下也从未出现过问题。但是,嘿,如果您喜欢会降低应用程序速度的无用内容,请调用同步...当然...;)
        • 真的很有帮助。我已经评论了同步()。根据需要使用sync()。
        • hii 如何在 swift 中将 nsuserdefaults 中的数据保存在单独的文件中
        【解决方案7】:
        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)
                    }
                }
            }
        }
        

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            A类中,为key设置值:

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

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

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 这行 'UserDefaults.standard.synchronize()' 作为可选是什么意思? @NikunjJoshi
              【解决方案11】:

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

              【讨论】:

              • 感谢您的帮助小姐。 :)
              【解决方案12】:

              你可以通过这种方式快速使用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
              }
              

              【讨论】:

              • 这篇文章的第一个版本说使用synchronize() 命令NSUserDefaults 来确保你的东西在做一个块的更改后被保存。这在 iOS 7 及更早版本中可能更为必要,但在 iOS 8 及更高版本中,您不应在大多数情况下调用 synchronize()。 请查看此处了解更多信息:codingexplorer.com/nsuserdefaults-a-swift-introduction
              【解决方案13】:
              //Save
              NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
              
              //retrive
              let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
              

              【讨论】:

              • 在 Swift 3 中:让分钟 = UserDefaults.standard.object(forKey: "minutes") as!字符串
              猜你喜欢
              • 2017-10-13
              • 2023-03-22
              • 1970-01-01
              • 2017-05-09
              • 1970-01-01
              • 1970-01-01
              • 2020-07-30
              • 2018-07-23
              相关资源
              最近更新 更多