Удалить значения ключа для 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]
}
Ответы
Ответ 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!)