ios 删除 Swift 中 NSUserDefaults 的键值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/34331170/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 08:24:49  来源:igfitidea点击:

Delete key values for NSUserDefaults in Swift

iosswiftnsuserdefaults

提问by Xernox

How to delete data from NSUserDefaults? There is quite a few answers how to do it in Objective C, but how about Swift? So I tried this:

如何从 NSUserDefaults 中删除数据?在Objective C中有很多答案如何做到这一点,但是Swift呢?所以我试过这个:

let defaults = NSUserDefaults.standardUserDefaults()
    defaults.removeObjectForKey("myKey")

Didn't work. Maybe what I really want to delete is not NSUserDefaults? This is how I save data:

没用。也许我真正想删除的不是 NSUserDefaults?这是我保存数据的方式:

class MySavedData: NSObject, NSCoding {
    var image: String

    init(name: String, image: String) {
        self.image = image
    }

    required init(coder aDecoder: NSCoder) {
        image = aDecoder.decodeObjectForKey("image") as! String
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(image, forKey: "image")
    }
}

class ViewController: <...> {
    var myData = [MySavedData]() //Later myData gets modified and then function save() is called

    func save() {
        let savedData = NSKeyedArchiver.archivedDataWithRootObject(myData)
        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(savedData, forKey: "myKey")
    }
}

EDIT:Just to clear some things - data that is being saved is small (not even close to 100kb)

编辑:只是为了清除一些东西 - 正在保存的数据很小(甚至不接近 100kb)

And maybe I am saving data not to NSUserDefaults (I am new to programming), so here is how I get it (load):

也许我不是将数据保存到 NSUserDefaults(我是编程新手),所以这里是我获取它的方式(加载):

let defaults = NSUserDefaults.standardUserDefaults()
if let savedData = defaults.objectForKey("myData") as? NSData {
    myData = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as! [UserLogin]
    }

回答by Peter Todd

removeObjectForKey is the right way to go.
This will remove the value for the selected key. The following code sets a string value for a key in NSUserDefaults, prints it and then uses removeObjectForKey to remove and print the key value again. After removeObjectForKey the value is nil.

removeObjectForKey 是正确的方法。
这将删除所选键的值。以下代码为 NSUserDefaults 中的键设置字符串值,打印它,然后使用 removeObjectForKey 删除并再次打印键值。在 removeObjectForKey 之后,该值为零。

let prefs = NSUserDefaults.standardUserDefaults()
var keyValue = prefs.stringForKey("TESTKEY")
print("Key Value not set \(keyValue)")
let strHello = "HELLO WORLD"

prefs.setObject(strHello, forKey: "TESTKEY")
keyValue = prefs.stringForKey("TESTKEY")
print("Key Value \(keyValue)")

prefs.removeObjectForKey("TESTKEY")
keyValue = prefs.stringForKey("TESTKEY")
print("Key Value after remove \(keyValue)")

Returns:

返回:

Key Value not set nil

键值未设置为零

Key Value Optional("HELLO WORLD")

键值可选(“你好世界”)

Key Value after remove nil

删除 nil 后的键值

Update Swift 3:

更新 Swift 3:

let prefs = UserDefaults.standard
keyValue = prefs.string(forKey:"TESTKEY")
prefs.removeObject(forKey:"TESTKEY")

回答by sourav

The code you have written will work fine, but NSUserDefaults synchronise at certain time interval.

您编写的代码可以正常工作,但 NSUserDefaults 以特定时间间隔同步。

As you want that should reflect in NSUserDefaults immediately ,so u need to write synchronise

正如你想要的那样,它应该立即反映在 NSUserDefaults 中,所以你需要写同步

let defaults = NSUserDefaults.standardUserDefaults()
defaults.removeObjectForKey("myKey") 
defaults.synchronize()

回答by Avijit Nagare

Try This

尝试这个

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)

for Swift 3

对于 Swift 3

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

But this will clear all values from NSUserDefaults.careful while using.

但这会在使用时清除 NSUserDefaults.careful 中的所有值。

回答by holex

I would go for a solution which setting the valueto nilfor a key.

我会去将设置一个解决方案价值,以nil一个关键

Swift 3

斯威夫特 3

UserDefaults.standard.set(nil, forKey: "key")

Swift 2.x

斯威夫特 2.x

NSUserDefaults.standardUserDefaults().setValue(nil, forKey: "key")


NOTE: that is a clear and straight statement, but bear in mind there is a limit to store information in NSUserDefaults, it is definitely notthe right place to store large binary files (like e.g. images) – for that there is a Documentsfolder. however it is not defined how big the var image: Stringwhich you encode/decode.

注:这是一个清晰而笔直的声明,但切记有存储信息的极限NSUserDefaults,这是绝对不能存储大量的二进制文件(例如像图片)在正确的地方-对,有一个Documents文件夹。但是它没有定义var image: String你编码/解码的大小。

回答by Daniel Jones

Removing UserDefaults for key in swift 3, based upon the top answer, just slightly different syntax:

根据最佳答案,删除 swift 3 中键的 UserDefaults,只是语法略有不同:

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

回答by Kandhal Bhutiya

Swift 4.x Remove all key in UserDefaults

Swift 4.x 删除 UserDefaults 中的所有键

let defaults = UserDefaults.standard
let dictionary = defaults.dictionaryRepresentation()

    dictionary.keys.forEach 
    { key in   defaults.removeObject(forKey: key)
    }

回答by Gaurav Gudaliya

Use following for loop:

使用以下 for 循环:

for key in NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys {
   NSUserDefaults.standardUserDefaults().removeObjectForKey(key.description)
}

回答by Adrian

To nuke all UserDefaultskeys, you can use the following code in Swift 3.x:

要取消所有UserDefaults键,您可以在 Swift 3.x 中使用以下代码:

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

回答by Kiran jadhav

Update code for Swift :Used below line of code to Delete key values for NSUserDefaults in Swift

更新 Swift 代码:使用下面的代码行删除 Swift 中 NSUserDefaults 的键值

UserDefaults.standard.setValue(nil, forKey: "YouEnterKey")

回答by Softlabsindia

func  remove_pref(remove_key : String){
    UserDefaults.standard.removeObject(forKey: remove_key)
    UserDefaults.standard.synchronize()
}