删除 Swift 中 NSUserDefaults 的键值

Delete key values for NSUserDefaults in Swift

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

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

没有成功。也许我真正要删除的不是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")
    }
}

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

也许我没有将数据保存到 NSUserDefaults(我是编程新手),所以我是这样获取(加载)的:

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

试试这个

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

对于Swift 3

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

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

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

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

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

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)")

Returns:

键值未设置为零

键值可选("HELLO WORLD")

删除 nil 后的键值

更新Swift3:

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

我会寻求一种解决方案,将 value 设置为 nil 以获得 key.

Swift 3

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

Swift 2.x

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

注意:这是一个明确而直接的陈述,但请记住在 NSUserDefaults 中存储信息是有限制的,这绝对是 而不是 [=31] =] 存储大型二进制文件(例如图像)的正确位置 - 为此,有一个 Documents 文件夹。但是它没有定义你 encode/decode.

var image: String 有多大

使用以下 for 循环:

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

删除 UserDefaults for key in swift 3,基于最佳答案,语法略有不同:

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

更新 Swift 的代码: 使用下面的代码行删除 Swift

中 NSUserDefaults 的键值
UserDefaults.standard.setValue(nil, forKey: "YouEnterKey")

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

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

Swift 4.x 删除 UserDefaults 中的所有密钥

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

    dictionary.keys.forEach 
    { key in   defaults.removeObject(forKey: key)
    }
func  remove_pref(remove_key : String){
    UserDefaults.standard.removeObject(forKey: remove_key)
    UserDefaults.standard.synchronize()
}

Swift5.0中,iOS15下面单行代码就够了。

UserDefaults.standard.dictionaryRepresentation().keys.forEach(defaults.removeObject(forKey:))

或者试试这个

if let appDomain = Bundle.main.bundleIdentifier {
   UserDefaults.standard.removePersistentDomain(forName: appDomain)
}