如何在Swift中使用UserDefaults?

Mit*_*ran 100 nsuserdefaults ios swift userdefaults

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

Anb*_*hik 292

ref:NSUserdefault objectTypes

斯威夫特3及以上

商店

UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key")  //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject
Run Code Online (Sandbox Code Playgroud)

取回

 UserDefaults.standard.bool(forKey: "Key")
 UserDefaults.standard.integer(forKey: "Key")
 UserDefaults.standard.string(forKey: "Key")
Run Code Online (Sandbox Code Playgroud)

去掉

 UserDefaults.standard.removeObject(forKey: "Key")
Run Code Online (Sandbox Code Playgroud)

删除所有密钥

 if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
 }
Run Code Online (Sandbox Code Playgroud)

斯威夫特2及以下

商店

NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)

取回

  var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]
Run Code Online (Sandbox Code Playgroud)

去掉

 NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")
Run Code Online (Sandbox Code Playgroud)

UserDefaults套件名称

另一个属性套件名称,主要用于 App Groups概念,我从这里采取的示例场景:

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

struct DetectLaunch {
static let keyforLaunch = "validateFirstlunch"
static var isFirst: Bool {
    get {
        return UserDefaults.standard.bool(forKey: keyforLaunch)
    }
    set {
        UserDefaults.standard.set(newValue, forKey: keyforLaunch)
    }
}
}
Run Code Online (Sandbox Code Playgroud)

使用userDefaults同步,详细信息已添加到重复的答案中.

  • @RajeshBaidya - userdefault始终只存储最终值 (2认同)

iSr*_*n27 29

使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

用于存储数据的密钥的枚举

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}
Run Code Online (Sandbox Code Playgroud)

在UserDefaults保存所需的位置

UserDefaults.standard.setLoggedIn(value: true)          // String
UserDefaults.standard.setUserID(value: result.User.id!) // String
Run Code Online (Sandbox Code Playgroud)

在app中的任何位置检索数据

print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()
Run Code Online (Sandbox Code Playgroud)

删除值

UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID) 
Run Code Online (Sandbox Code Playgroud)

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

更新 您不需要使用synchronize()来存储值.由于@Moritz指出它没有必要,并给出了关于它的文章.检查评论更多细节

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

小智 12

斯威夫特4:

商店

    UserDefaults.standard.set(object/value, forKey: "key_name")
Run Code Online (Sandbox Code Playgroud)

Retrive

    var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]
Run Code Online (Sandbox Code Playgroud)

去掉

    UserDefaults.standard.removeObject(forKey:"key_name") 
Run Code Online (Sandbox Code Playgroud)


Man*_*mam 6

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)
 }
}
Run Code Online (Sandbox Code Playgroud)

用法:

保存价值:

UserDefaultHelper.userloginId = data["user_id"] as? String
Run Code Online (Sandbox Code Playgroud)

获取值:

let userloginid = UserDefaultHelper.userloginId
Run Code Online (Sandbox Code Playgroud)

删除值:

UserDefaultHelper.deleteUserLoginId()
Run Code Online (Sandbox Code Playgroud)