Я пытаюсь проверить, существует ли значение по умолчанию для пользователя, как показано ниже:
func userAlreadyExist() -> Bool {
var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
if userDefaults.objectForKey(kUSERID) {
return true
}
return false
}
Однако не важно, что он всегда будет возвращать истину, даже если объект еще не существует? Это правильный способ проверки существования?
ios
swift
nsuserdefaults
Райан
источник
источник
Да, это правильный способ проверить
optional
, возвращаетnil
лиobjectForKey
метод has или любое значение,AnyObject?
которое естьImplicit optional
.Итак, если
userDefaults.objectForKey(kUSERID)
есть какое-либо значение, чем оно оцениваетсяtrue
. еслиuserDefaults.objectForKey(kUSERID)
имеетnil
значение, чем оцениваетсяfalse
.Из руководства по быстрому программированию
Теперь в симуляторах есть ошибка,
userDefaults
поэтому после установки ключа они всегда остаются установленными, независимо от того, удаляете ли вы свое приложение. Вам необходимо сбросить симулятор.Сбросить Simulator проверить этот метод перед установкой ключа в
userDefaults
или вынуть ключuserDefaults.removeObjectForKey(kUSERID)
изuserDefaults
и он будет возвращатьNO
.А устройство оно разрешаемаяiOS8 beta4
.источник
objectForKey
метод возвращает,AnyObject!
который является неявным необязательным». Это неверно, он возвращаетAnyObject?
if anOptional { }
и предложит вам протестировать с использованием == nil или! =По сути, это то же самое, что предлагается в других ответах, но более удобным способом (Swift 3+):
extension UserDefaults { static func contains(_ key: String) -> Bool { return UserDefaults.standard.object(forKey: key) != nil } }
Применение:
if UserDefaults.contains(kUSERID) { ... }
источник
static func contains(key: String) -> Bool
. В противном случае имеет смысл сделать большеreturn self.object(forKey: key) != nil
Простой код, чтобы проверить, сохранено ли значение в UserDefault.
let userdefaults = UserDefaults.standard if let savedValue = userdefaults.string(forKey: "key"){ print("Here you will get saved value") } else { print("No value in Userdefault,Either you can save value here or perform other operation") userdefaults.set("Here you can save value", forKey: "key") }
источник
для swift 3.2
func userAlreadyExist(kUsernameKey: String) -> Bool { return UserDefaults.standard.object(forKey: kUsernameKey) != nil }
источник
public class PreferencesUtils { private init() { } public static func setBoolData(boolValue: Bool, dataName: String) { UserDefaults.standard.set(boolValue, forKey: dataName) } public static func getBoolData(dataName: String)-> Bool{ let defaults = UserDefaults.standard if(defaults.value(forKey: dataName) != nil) { return defaults.value(forKey: dataName)! as! Bool } else { return false } } public static func saveStringData(data: String, dataName: String){ let preferences = UserDefaults.standard preferences.set(data, forKey: dataName) let didSave = preferences.synchronize() if !didSave { debugPrint("Not saved yet") } } public static func getSavedStringData(dataName: String)-> String{ let defaults = UserDefaults.standard if(defaults.value(forKey: dataName) != nil){ return defaults.value(forKey: dataName) as! String } else { return "" } } public static func saveIntData(data : Int, dataName: String){ let preferences = UserDefaults.standard preferences.set(data, forKey: dataName) let didSave = preferences.synchronize() if !didSave { debugPrint("Not saved yet") } } public static func getSavedIntData(dataName: String) -> Int { let defaults = UserDefaults.standard if(defaults.value(forKey: dataName) != nil){ return defaults.value(forKey: dataName) as! Int }else{ return 0 } } }
Или вы можете попробовать эту библиотеку: Ссылка
источник
func keyExists(key: String) -> Bool { guard let _ = UserDefaults.standard.object(forKey: key) { return false; } return true; }
источник
переопределить функцию viewDidLoad () {
super.viewDidLoad ()
если UserDefaults.standard.string (forKey: "ЧАРРИ") == "ЧАРРИ" {
lb.text = "CHARRY" im.image = UIImage(named: "CHARRY")
}}
@IBAction func PressedCar(_ sender: UIButton){ lb.text = "CHARRY" im.image = UIImage(named: "CHARRY") UserDefaults.standard.set("CAR", forKey: "CHARRY") }
источник
Многие из решений здесь действительны. Тем не менее, я думаю, что они решают не ту проблему.
Обычно такой код используется для проверки того, установлено ли значение, чтобы можно было использовать другое значение по умолчанию:
if isKeyPresentInUserDefaults(key: "username") { return UserDefaults.standard.string(forKey: "username") } else { return "No username was set" }
Вам все равно, установлен ключ или нет. Существует гораздо более элегантный подход для использования значений по умолчанию в
UserDefaults
:UserDefault.standard.register(defaults: ["username": "No username was set"])
Если вы запустите этот код при запуске приложения, последующие вызовы
UserDefaults.standard.string(forKey: "username")
вернут значение по умолчанию,"No username was set"
если для ключа еще не было установлено значение.источник