Подтвердить что ты не робот

Удалить значения ключа для NSUserDefaults в 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 (я новичок в программировании), так вот как я его получаю (load):

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

Ответ 1

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

Возврат:

Значение ключа не установлено nil

Значение ключа необязательно ( "HELLO WORLD" )

Значение ключа после удаления nil

Обновить Swift 3:

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

Ответ 2

Код, который вы написали, будет работать нормально, но NSUserDefaults синхронизируются в определенный промежуток времени.

Как вы хотите, это должно немедленно отразиться на NSUserDefaults, поэтому вам нужно написать synchronize

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

Ответ 3

Попробуйте это

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

для Swift 3

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

Но это очистит все значения из NSUserDefaults.careful при использовании.

Ответ 4

Я бы выбрал решение, которое установило значение nil для ключа.

Swift 3

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

Swift 2.x

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

ПРИМЕЧАНИЕ: это четкое и прямое утверждение, но помните, что существует ограничение на хранение информации в NSUserDefaults, это определенно not в нужном месте для хранения больших двоичных файлов (например, например изображения) - для этого существует папка Documents. однако не определено, насколько велика var image: String, которую вы кодируете/декодируете.

Ответ 5

Используйте следующий цикл:

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

Ответ 6

Удаление UserDefaults для ключа в swift 3, основанный на верхнем ответе, немного отличающийся синтаксис:

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

Ответ 7

Обновить код для Swift: Используется под строкой кода для удаления значений ключа для NSUserDefaults в Swift

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

Ответ 8

Чтобы задействовать все клавиши UserDefaults, вы можете использовать следующий код в Swift 3.x:

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