Xernox
Xernox

Reputation: 1736

Delete key values for NSUserDefaults in Swift

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]
    }

Upvotes: 56

Views: 90492

Answers (11)

Naresh
Naresh

Reputation: 17932

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

Upvotes: 1

Softlabsindia
Softlabsindia

Reputation: 921

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

Upvotes: 0

Kandhal Bhutiya
Kandhal Bhutiya

Reputation: 198

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

Upvotes: 6

Avijit Nagare
Avijit Nagare

Reputation: 8802

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.

Upvotes: 13

holex
holex

Reputation: 24031

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.

Upvotes: 3

Adrian
Adrian

Reputation: 16735

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

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

Upvotes: 1

Kiran Jadhav
Kiran Jadhav

Reputation: 3327

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

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

Upvotes: -1

Peter Todd
Peter Todd

Reputation: 8651

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

Upvotes: 96

Fun Programmer
Fun Programmer

Reputation: 1082

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

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

Upvotes: 9

Gaurav Gudaliya
Gaurav Gudaliya

Reputation: 131

Use following for loop:

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

Upvotes: 3

sourav
sourav

Reputation: 819

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

Upvotes: 18

Related Questions