Controlla se esiste UserDefault - Swift


87

Sto cercando di verificare se esiste il valore predefinito di un utente, visto di seguito:

func userAlreadyExist() -> Bool {
    var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Tuttavia, non importa cosa tornerà sempre vero anche quando l'oggetto non esiste ancora? È questo il modo giusto per verificare l'esistenza?

Risposte:


129

Astun ha un'ottima risposta. Vedi sotto per la versione Swift 3.

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

29

Ho copiato / incollato il tuo codice ma Xcode 6.1.1 mi stava lanciando alcuni errori, è finito per assomigliare a questo e funziona come un incantesimo. Grazie!

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}

Lavorato! Ma hai dimenticato il parametro, quindi l'ho aggiunto.
Jesse Onolemen

21

Sì, questo è il modo giusto per controllare i risultati del metodo optionalhave nilo di qualsiasi valore che sia .objectForKeyAnyObject?Implicit optional

Quindi, se userDefaults.objectForKey(kUSERID)ha un valore di quello che valuta true. se userDefaults.objectForKey(kUSERID)ha un nilvalore di quello che valuta false.

Dalla guida rapida alla programmazione

Istruzioni If e annullamento del wrapping forzato È possibile utilizzare un'istruzione if per scoprire se un opzionale contiene un valore. Se un opzionale ha un valore, restituisce true; se non ha alcun valore, restituisce false.

Ora c'è un bug nei simulatori che dopo aver impostato la chiave userDefaultsrimangono sempre impostati indipendentemente dall'eliminazione dell'app. È necessario ripristinare il simulatore.

Ripristina il tuo simulatore controlla questo metodo prima di inserire la chiave userDefaultso rimuovi la chiave userDefaults.removeObjectForKey(kUSERID)da userDefaults e tornerà NO. Sui dispositivi è risolto iOS8 beta4.


" objectForKeyrestituisce il metodo AnyObject!che è implicito facoltativo" Questo è sbagliato restituisceAnyObject?
Leo Dabus

1
@LeoDabus Swift è cambiato così tante volte. Grazie BTW l'ho cambiato.
codester

a partire dal 25/10/2016 la riga nei documenti ora dice "Puoi usare un'istruzione if per scoprire se un opzionale contiene un valore confrontando l'opzionale con zero. Esegui questo confronto con l'operatore" uguale a "(= =) o l'operatore "diverso da" (! =). " Xcode 7.3.1 mostrerà un errore di compilazione se ci provi if anOptional { }e ti suggerirà di provare usando == nil o! =
Nil

15

Questo è essenzialmente lo stesso suggerito in altre risposte ma in un modo più conveniente (Swift 3+):

extension UserDefaults {
    static func contains(_ key: String) -> Bool {
        return UserDefaults.standard.object(forKey: key) != nil
    }
}

utilizzo: if UserDefaults.contains(kUSERID) { ... }


allora ha senso per rendere la funzione statica perché si sta accedendo un singleton di serie : static func contains(key: String) -> Bool. Altrimenti, ha più senso farereturn self.object(forKey: key) != nil
Nomad Developer

5

Codice semplice per verificare se il valore è archiviato in 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")
}

2

per swift 3.2

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return UserDefaults.standard.object(forKey: kUsernameKey) != nil
}

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
        }
    }

}

Oppure puoi provare questa libreria: Link


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

   return true;
}

Si prega di non pubblicare solo il codice come risposta, ma fornire anche una spiegazione su cosa fa il codice e come risponde alla domanda. Le risposte con una spiegazione sono generalmente più utili e di migliore qualità e hanno maggiori probabilità di attirare voti positivi.
Mark Rotteveel

0

override func viewDidLoad () {

super.viewDidLoad ()

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


}

0

Molte delle soluzioni qui sono valide. Tuttavia, penso che risolvano il problema sbagliato.

Di solito, un codice come questo viene utilizzato per verificare se un valore è impostato in modo da poter utilizzare un altro valore predefinito:

if isKeyPresentInUserDefaults(key: "username") {
    return UserDefaults.standard.string(forKey: "username")
} else {
    return "No username was set"
}

Non dovresti preoccuparti se una chiave è impostata o meno. C'è un approccio molto più elegante per avere valori predefiniti in UserDefaults:

UserDefault.standard.register(defaults: ["username": "No username was set"])

Se esegui questo codice all'avvio dell'app, le chiamate successive a UserDefaults.standard.string(forKey: "username")restituiranno il valore predefinito di "No username was set"se non è stato ancora impostato alcun valore per la chiave.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.