【问题标题】:how to defaults.removeObjectForKey("") properly swift如何正确快速地 defaults.removeObjectForKey("")
【发布时间】:2015-03-14 16:05:22
【问题描述】:

我有以下:

                let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
                let phone = defaults.objectForKey("phone") as String                   
                println(phone)       
                defaults.removeObjectForKey("phone")
                println("phone2\(phone)")

尽管尝试取消设置,但打印结果仍显示相同的结果,例如“5”或“6”。

【问题讨论】:

  • 设置手机后,不会随着 NSUserDefaults 的变化而变化
  • @JamesShelton 你试过arthankamal的代码了吗?它非常适合我。
  • 不知道为什么人们会对此投反对票。互动表明这是一个合理的问题。

标签: ios iphone xcode swift


【解决方案1】:

您正在打印变量phoneremoveObjectForKey 不会更新变量phone。因此,您必须从NSUserdefaults 获取更新后的值,

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Hello", forKey: "phone")
let phone = defaults.objectForKey("phone") as String
// This will save your value in `phone`
// Do not synchronize after removing the key, if you want 'value' for your key 'phone' after your application terminated
defaults.synchronize() 
println(phone)
defaults.removeObjectForKey("phone")

// Get the updated value,
let updatedPhone = defaults.objectForKey("phone") as String?
// This will save nil in your `phone` key, make sure that what you want
defaults.synchronize() 
println("phone2\(updatedPhone)")

就像@Lyndshey 所说,您不必Synchronize,因为它会定期自动发生。但是如果你等不及了,你的应用要退出了,你可以Synchronize,但这确实是性能问题。

请查看Apple Documentation,也请查看Stackoverflow answer

【讨论】:

  • 是的,它会起作用的。但是如果你想拥有价值,在应用程序终止后,你需要synchronize()它。
  • 终止后我确实想要它。如何将 synchronize() 放在一个类之上?
  • 或者在主要类之上创建一个新类...像这样?类 syncit{ 让默认值: NSUserDefaults = NSUserDefaults.standardUserDefaults() defaults.synchronize() }
  • @arthankamal 您更新的答案完全违背了 Apple 的建议。实际上,OP 应该只是在 appDelegate 中的 applicationWillTerminate 中调用同步。
  • @LyndseyScott,你是对的,我也给出了参考,但现在它真的取决于 James Shelton。
【解决方案2】:

答案很简单。您正在打印之前分配的 phone 变量。您需要再次从NSUserDefaults 中检索该值以检查它是否存在。

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
var phone = defaults.objectForKey("phone") as String                   
println(phone)       
defaults.removeObjectForKey("phone")
if let phone = defaults.objectForKey("phone") as? String
{
        println("phone2\(phone)")
}
else
{
        println("Value is nil")
}

【讨论】:

  • 我进行了搜索并将所有更改为 let:var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()。但是,我仍然没有得到重置。
  • 我还需要将 let phone 更改为 var phone 吗?
  • 即使在任何地方都设置了 let defaults 和 var phone,它也知道什么手机仍然存在
  • @JamesShelton:上面的代码不会给出那个结果。如果条件永远不会起作用(因为电话为零)。我在发布之前在我的示例应用中检查了它。
  • @JamesShelton arthankamal 的答案似乎更像您在这种特殊情况下要寻找的东西......我建议也尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2016-08-13
相关资源
最近更新 更多