Respuestas:
Swift 3.0
La respuesta a continuación ya no es el caso cuando probé esto. Cuando se establece en nilel resultado, se almacena NSCFData. Posiblemente una referencia de objeto NSNull, pero no estoy seguro.
Para eliminar completamente un valor para el uso de una clave UserDefaults.standard.removeObject(forKey: "YourDefault")
Probé con el siguiente código:
UserDefaults.standard.set(["a", "b", "c"], forKey: "MyDefaults")
print("Test A: My saved defaults \(UserDefaults.standard.object(forKey: "MyDefaults"))")
UserDefaults.standard.set(nil, forKey: "MyDefaults")
print("Test B: My defaults set to nil \(UserDefaults.standard.object(forKey: "MyDefaults"))")
UserDefaults.standard.removeObject(forKey: "MyDefaults")
print("Test C: My defaults removed \(UserDefaults.standard.object(forKey: "MyDefaults"))")
Sí, ambas líneas de código son equivalentes, ambas resultarán en lectura nula
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];
NSUserDefaultsdevolverá nil si no se encontró la clave. Recomendaría usar el en removeObjectForKeylugar de establecerlo en cero.
aquí se explica cómo probar si establecer el valor de la clave en cero eliminó la entrada de la clave NSUserDefaults standardUserDefaults.
NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
for(NSString *key in keys) {
NSLog(@"Key Name: %@", key);
}
[keys release];
o simplemente volcar el diccionario clave / valor de NSUserDefaults standardUserDefaults
NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
removeObjectForKey?
setObject:niltambién eliminará el objeto, no solo su clave. Entonces, ambas funciones causan exactamente el mismo resultado. Además, si elimina (o establece en cero) el único objeto almacenado (y clave), se elimina todo el archivo .plist.
Swift 5.0 + iOS 11 y posteriores
Ambos métodos eliminan el valor. Probé esto en un patio de recreo:
import Foundation
let key = "Test"
let value = "test"
let defaults = UserDefaults.standard
func printUD() {
print("UserDefaults after modification:\n")
defaults.dictionaryRepresentation().forEach { print("\($0): \($1)\n") }
print("-------------\n\n")
}
defaults.set(value, forKey: key); printUD()
defaults.set(nil, forKey: key); printUD()
defaults.set(value, forKey: key); printUD()
defaults.removeObject(forKey: key); printUD()
Antes de IOS 11 este se traducirá en la serialización nilen Datay lanzar un error.