如何在Swift中使用UserDefaults?

15 浏览
0 Comments

如何在Swift中使用UserDefaults?

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

0
0 Comments

在Swift中,使用UserDefaults可以方便地存储和获取用户的偏好设置数据。然而,有时候会遇到一些问题,比如在存储数据之后,数据并没有被立即写入磁盘。这时候,可以使用UserDefaults的synchronize()方法来强制将数据立即写入磁盘。

下面是使用UserDefaults的一些常用操作:

存储数据:

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(),它是可选的,意思是可以选择是否调用这个方法。synchronize()方法的作用是将数据立即写入磁盘,而不是等到系统自动写入磁盘。通常情况下,系统会在适当的时机自动写入磁盘,所以我们不需要手动调用这个方法。但是,如果你希望立即将数据写入磁盘,可以调用这个方法。

希望这篇文章对你理解如何在Swift中使用UserDefaults有所帮助!

0
0 Comments

UserDefaults是一种用于存储应用程序数据的机制,可以在应用程序的各个部分之间共享数据。它是一个键值对存储,可以用来存储布尔值、整数和字符串等数据类型。

在Swift中,可以使用UserDefaults来存储、检索和删除数据。以下是在Swift 3及以上版本中使用UserDefaults的示例代码:

存储数据:

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及以下版本中使用UserDefaults的示例代码如下:

存储数据:

NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")

NSUserDefaults.standardUserDefaults().synchronize()

检索数据:

var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]

删除数据:

NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")

除了以上用法外,还可以使用UserDefaults的register方法来注册默认值,并可以通过UserDefaults的suite name属性设置UserDefaults的套件名称。

为了演示UserDefaults的用法,下面以一个应用程序的启动为例,创建了一个用于保存启动信息的结构体DetectLaunch,并注册了默认值:

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

])

在应用程序终止时,可以通过设置DetectLaunch.isFirst的值来删除该值:

func applicationWillTerminate(_ application: UIApplication) {

DetectLaunch.isFirst = false

}

最后,可以通过检查DetectLaunch.isFirst的值来判断应用程序是首次启动还是非首次启动。

另外,UserDefaults还提供了suite name属性,用于设置UserDefaults的套件名称。这个属性主要用于App Groups的概念,可以将UserDefaults的数据与其他应用程序共享。例如,可以通过以下代码创建一个带有套件名称的UserDefaults对象:

let user = UserDefaults(suiteName:"User")

最后,对于UserDefaults的存储方法,可以在应用程序关闭之前调用,也可以在值发生变化时调用。值得注意的是,UserDefaults始终只存储最终值。而对于数据是否在应用程序的安装和卸载中持久化存储,UserDefaults是会持久化存储的。

0
0 Comments

如何在Swift中使用UserDefaults?

UserDefaults是一种用于存储应用程序数据的机制。您可以使用UserDefaults在应用程序中保存和检索用户的偏好设置和其他简单的数据。下面是在Swift中使用UserDefaults的最佳方法:

步骤:

1. 创建UserDefaults的扩展

2. 创建一个包含需要存储在本地的键的枚举

3. 在任何您想要的地方存储和检索本地数据

示例:

extension UserDefaults{

//MARK: 检查登录

func setLoggedIn(value: Bool) {

set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)

//synchronize()

}

func isLoggedIn()-> Bool {

return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)

}

//MARK: 保存用户数据

func setUserID(value: Int){

set(value, forKey: UserDefaultsKeys.userID.rawValue)

//synchronize()

}

//MARK: 检索用户数据

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)

这样,您就可以在UserDefaults中存储原始数据。

更新:

您不需要使用synchronize()来存储值。如上所述,这是不必要的,而且可能会减慢默认访问。不要使用sync,它已经过时且有问题。请参阅codingexplorer.com/nsuserdefaults-a-swift-introduction中的“更新”部分。我还进行了许多关于此的测试,并在所有应用程序中删除了对sync的所有调用,即使在极端情况下也没有出现任何问题。但是,如果您喜欢无用的、可能会减慢应用程序的东西,请调用sync...

另外,您可以使用计算属性而不是成对的setter/getter方法,这样会更简洁。

0