Verifique se o UserDefault existe - Swift

87

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?

Ryan
fonte

Respostas:

127

Astun tem uma ótima resposta. Veja abaixo a versão Swift 3.

func isKeyPresentInUserDefaults(key: String) -> Bool {
    return UserDefaults.standard.object(forKey: key) != nil
}
user7248923
fonte
29

Eu copiei / colei seu código, mas o Xcode 6.1.1 estava lançando alguns erros no meu caminho, acabou ficando assim e funciona perfeitamente. Obrigado!

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}
Astun
fonte
Funcionou! Mas você esqueceu o parâmetro, então eu o adicionei.
Jesse Onolemen
21

Sim este é o caminho certo para verificar a optionaltem nilou qualquer valor objectForKeymétodo retorna AnyObject?o que é Implicit optional.

Portanto, se userDefaults.objectForKey(kUSERID)tiver algum valor do que avalia true. se userDefaults.objectForKey(kUSERID)tem nilvalor do que avalia false.

Do guia de programação rápida

Instruções If e desembrulhamento forçado Você pode usar uma instrução if para descobrir se um opcional contém um valor. Se um opcional tiver um valor, ele será avaliado como verdadeiro; se não tiver nenhum valor, será avaliado como falso.

Agora, há um bug nos simuladores que depois de definir a chave, userDefaultseles sempre permanecem definidos, não importa se você exclua seu aplicativo.

Redefinir sua Simulator verificar este método antes de definir chave na userDefaultsou remova a chave userDefaults.removeObjectForKey(kUSERID)de userDefaults e ele irá retornar NOdispositivos .No que seja resolvido em iOS8 beta4.

codester
fonte
" objectForKeymétodo retorna AnyObject!que é opcional implícito" Isto está errado, ele retornaAnyObject?
Leo Dabus
1
@LeoDabus Swift mudou tantas vezes. Obrigado BTW eu mudei isso.
codester
em 25/10/2016, a linha nos documentos agora diz "Você pode usar uma instrução if para descobrir se um opcional contém um valor comparando o opcional com nulo. Você executa essa comparação com o operador" igual a "(= =) ou o operador “diferente de” (! =). " O Xcode 7.3.1 mostrará um erro de compilação se você tentar if anOptional { }e irá sugerir que você teste usando == nil ou! =
Nil
14

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

Sir Codesalot
fonte
então faz sentido para fazer a função estática porque você está acessando um singleton padrão : static func contains(key: String) -> Bool. Caso contrário, faz mais sentido fazerreturn self.object(forKey: key) != nil
Nomad Developer
5

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")
}
Sudhi 9135
fonte
2

para swift 3.2

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return UserDefaults.standard.object(forKey: kUsernameKey) != nil
}
Johny D Good
fonte
0
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

Jamil Hasnine Tamim
fonte
0
func keyExists(key: String) -> Bool {
    guard let _ = UserDefaults.standard.object(forKey: key) {
     return false;
    }

   return true;
}
Andrea Leganza
fonte
Não poste apenas código como resposta, mas também forneça uma explicação sobre o que seu código faz e como ele responde à pergunta. As respostas com uma explicação geralmente são mais úteis e de melhor qualidade e têm mais probabilidade de atrair votos positivos.
Mark Rotteveel
0

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


}
hamayun zeb
fonte
0

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.

Xavier Lowmiller
fonte