Delete key values for NSUserDefaults in Swift

IosSwiftNsuserdefaults

Ios Problem Overview


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:

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:

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)

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

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

Ios Solutions


Solution 1 - Ios

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.

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

Update Swift 3:

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

Solution 2 - Ios

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

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

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

Solution 3 - Ios

Try This

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

for Swift 3

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

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

Solution 4 - Ios

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

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

Solution 5 - Ios

Swift 4.x Remove all key in UserDefaults

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

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

Solution 6 - Ios

I would go for a solution which setting the value to nil for a key.

##Swift 3

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

##Swift 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 not the right place to store large binary files (like e.g. images) – for that there is a Documents folder. however it is not defined how big the var image: String which you encode/decode.

Solution 7 - Ios

Use following for loop:

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

Solution 8 - Ios

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

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

Solution 9 - Ios

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

Solution 10 - Ios

In Swift 5.0, iOS 15 below single line of code is enough.

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

Or try this

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

Solution 11 - Ios

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionXernoxView Question on Stackoverflow
Solution 1 - IosPeter ToddView Answer on Stackoverflow
Solution 2 - IossouravView Answer on Stackoverflow
Solution 3 - IosAvijit NagareView Answer on Stackoverflow
Solution 4 - IosDaniel JonesView Answer on Stackoverflow
Solution 5 - IosKandhal BhutiyaView Answer on Stackoverflow
Solution 6 - IosholexView Answer on Stackoverflow
Solution 7 - IosGaurav GudaliyaView Answer on Stackoverflow
Solution 8 - IosAdrianView Answer on Stackoverflow
Solution 9 - IosSoftlabsindiaView Answer on Stackoverflow
Solution 10 - IosNareshView Answer on Stackoverflow
Solution 11 - IosKiran JadhavView Answer on Stackoverflow