如何在Swift中使用UserDefaults?

时间:2015-07-03 09:26:39

标签: ios swift nsuserdefaults userdefaults

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

13 个答案:

答案 0 :(得分:255)

参考: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")

UserDefaults套件名称

另一个属性suite name,主要用于App Groups concept,我从here获取的示例方案:

  

用例是我想将我的UserDefaults(不同的业务逻辑可能要求UserDefaults分开分组)与Android的SharedPreferences之类的标识符分开。例如,当我的应用程序中的用户点击退出按钮时,我想清除他的帐户相关默认值,但不清除设备的位置。

let user = UserDefaults(suiteName:"User")

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

答案 1 :(得分:22)

使用 UserDefaults

的最佳方式

<强>步骤

  1. 创建UserDefaults的扩展程序
  2. 创建包含所需键的枚举 存储在本地
  3. 随时随地存储和检索本地数据
  4. 示例

    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指出它没有必要并且给出了关于它的文章。查看更多细节的评论

答案 2 :(得分:10)

Swift 4

商品

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

<强> Retrive

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

删除

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

答案 3 :(得分: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
}

答案 4 :(得分:1)

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

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

答案 5 :(得分: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

答案 6 :(得分:0)

A类中,设置键的值:

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

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

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

答案 7 :(得分:0)

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 :(得分:0)

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

这是 Swift 5

中更新的代码片段
  

在首选项中存储数据

@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

    }
  

从偏好设置中获取数据

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

答案 9 :(得分:0)

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

:)

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

答案 12 :(得分:-1)

迅速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()
    }
}

要使用用户默认值存储值,

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

要从userdefaults中检索值,

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)