Estou tentando verificar se existe um usuário padrão, visto abaixo:
func userAlreadyExist() -> Bool {
var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
if userDefaults.objectForKey(kUSERID) {
return true
}
return false
}
No entanto, não importa o que sempre retornará verdadeiro mesmo quando o objeto ainda não existe? É esta a maneira certa de verificar a existência?
ios
swift
nsuserdefaults
Ryan
fonte
fonte
Sim este é o caminho certo para verificar a
optional
temnil
ou qualquer valorobjectForKey
método retornaAnyObject?
o que éImplicit optional
.Portanto, se
userDefaults.objectForKey(kUSERID)
tiver algum valor do que avaliatrue
. seuserDefaults.objectForKey(kUSERID)
temnil
valor do que avaliafalse
.Do guia de programação rápida
Agora, há um bug nos simuladores que depois de definir a chave,
userDefaults
eles sempre permanecem definidos, não importa se você exclua seu aplicativo.Redefinir sua Simulator verificar este método antes de definir chave na
userDefaults
ou remova a chaveuserDefaults.removeObjectForKey(kUSERID)
deuserDefaults
e ele irá retornarNO
dispositivos .No que seja resolvido emiOS8 beta4
.fonte
objectForKey
método retornaAnyObject!
que é opcional implícito" Isto está errado, ele retornaAnyObject?
if anOptional { }
e irá sugerir que você teste usando == nil ou! =Este é essencialmente o mesmo sugerido em outras respostas, mas de uma forma mais conveniente (Swift 3+):
extension UserDefaults { static func contains(_ key: String) -> Bool { return UserDefaults.standard.object(forKey: key) != nil } }
uso:
if UserDefaults.contains(kUSERID) { ... }
fonte
static func contains(key: String) -> Bool
. Caso contrário, faz mais sentido fazerreturn self.object(forKey: key) != nil
Código simples para verificar se o valor está armazenado no 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") }
fonte
para swift 3.2
func userAlreadyExist(kUsernameKey: String) -> Bool { return UserDefaults.standard.object(forKey: kUsernameKey) != nil }
fonte
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 } } }
Ou você pode tentar esta biblioteca: Link
fonte
func keyExists(key: String) -> Bool { guard let _ = UserDefaults.standard.object(forKey: key) { return false; } return true; }
fonte
substituir função viewDidLoad () {
super.viewDidLoad ()
if UserDefaults.standard.string (forKey: "CHARRY") == "CHARRY" {
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") }
fonte
Muitas das soluções aqui são válidas. Mesmo assim, acho que eles resolvem o problema errado.
Normalmente, um código como este é usado para verificar se um valor está definido para que outro valor padrão possa ser usado:
if isKeyPresentInUserDefaults(key: "username") { return UserDefaults.standard.string(forKey: "username") } else { return "No username was set" }
Você não deve se preocupar se uma chave está definida ou não. Há uma abordagem muito mais elegante para ter valores padrão em
UserDefaults
:UserDefault.standard.register(defaults: ["username": "No username was set"])
Se você executar este código na inicialização do aplicativo, as chamadas subsequentes para
UserDefaults.standard.string(forKey: "username")
retornarão o valor padrão de"No username was set"
se nenhum valor foi definido para a chave ainda.fonte