在Swift中删除NSUserDefaults的键值

Xer*_*nox 39 nsuserdefaults ios swift

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

let defaults = NSUserDefaults.standardUserDefaults()
    defaults.removeObjectForKey("myKey")
Run Code Online (Sandbox Code Playgroud)

没工作.也许我真正想要删除的不是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")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

也许我正在保存数据而不是NSUserDefaults(我是编程新手),所以这是我如何得到它(加载):

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

Pet*_*odd 72

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

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

返回:

键值未设置为零

关键价值可选("你好世界")

删除nil后的键值

更新Swift 3:

let prefs = UserDefaults.standard
keyValue = prefs.string(forKey:"TESTKEY")
prefs.removeObject(forKey:"TESTKEY")
Run Code Online (Sandbox Code Playgroud)


sou*_*rav 14

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

如你所愿,它应该立即反映在NSUserDefaults中,所以你需要编写同步

let defaults = NSUserDefaults.standardUserDefaults()
defaults.removeObjectForKey("myKey") 
defaults.synchronize()
Run Code Online (Sandbox Code Playgroud)


Avi*_*are 10

试试这个

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
Run Code Online (Sandbox Code Playgroud)

对于Swift 3

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*nes 6

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

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

  • 这应该是公认的答案。不需要多行代码。 (2认同)

小智 5

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

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

    dictionary.keys.forEach 
    { key in   defaults.removeObject(forKey: key)
    }
Run Code Online (Sandbox Code Playgroud)