Überprüfen Sie, ob UserDefault vorhanden ist - Swift


84

Ich versuche zu überprüfen, ob ein Benutzerstandard vorhanden ist (siehe unten):

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Aber egal was es immer wahr zurückgibt, auch wenn das Objekt noch nicht existiert? Ist dies der richtige Weg, um die Existenz zu überprüfen?

Antworten:


124

Astun hat eine gute Antwort. Siehe unten für die Swift 3-Version.

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

29

Ich habe Ihren Code kopiert / eingefügt, aber Xcode 6.1.1 hat einige Fehler in meine Richtung geworfen. Am Ende sah es so aus und es funktioniert wie ein Zauber. Vielen Dank!

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

Hat funktioniert! Aber Sie haben den Parameter vergessen, also habe ich ihn hinzugefügt.
Jesse Onolemen

21

Ja , das ist richtig das überprüfen optionalhat niloder beliebigen Wert objectForKeyMethode gibt , AnyObject?die sind Implicit optional.

Wenn Sie userDefaults.objectForKey(kUSERID)also einen Wert haben, der ausgewertet wird true. Wenn userDefaults.objectForKey(kUSERID)hat nilWert als es auswertet false.

Von schnellen Programmierung Führung

If-Anweisungen und erzwungenes Entpacken Mit einer if-Anweisung können Sie herausfinden, ob ein optionales Element einen Wert enthält. Wenn ein optionales Element einen Wert hat, wird es als wahr ausgewertet. Wenn es überhaupt keinen Wert hat, wird es als falsch ausgewertet.

Jetzt gibt es einen Fehler in Simulatoren, der nach dem Einstellen des Schlüssels userDefaultsimmer gesetzt bleibt, unabhängig davon, ob Sie Ihre App löschen. Sie müssen den Simulator zurücksetzen.

Setzen Sie den Simulator dieser Methode überprüfen , bevor Sie Schlüssel in userDefaultsoder ziehen Sie den Schlüssel userDefaults.removeObjectForKey(kUSERID)aus , userDefaults und es wird wieder NO.Auf Geräte es in behoben ist iOS8 beta4.


" objectForKeyMethode gibt zurück, AnyObject!was implizit optional ist" Dies ist falsch, es gibt zurückAnyObject?
Leo Dabus

1
@LeoDabus Swift hat sich so oft verändert. Danke übrigens habe ich das geändert.
Codester

Ab dem 25.10.2016 steht in der Zeile in den Dokumenten jetzt "Sie können eine if-Anweisung verwenden, um herauszufinden, ob ein optionales Element einen Wert enthält, indem Sie das optionale mit null vergleichen. Sie führen diesen Vergleich mit dem Operator" gleich "(= durch) =) oder der Operator "ungleich" (! =). " Xcode 7.3.1 zeigt einen Kompilierungsfehler an, wenn Sie es versuchen, if anOptional { }und es wird vorgeschlagen, dass Sie mit == nil oder! = Nil
wyu

13

Dies ist im Wesentlichen dasselbe wie in anderen Antworten vorgeschlagen, jedoch auf bequemere Weise (Swift 3+):

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

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


Dann ist es sinnvoll, die Funktion statisch zu machen, da Sie auf einen Singleton- Standard zugreifen : static func contains(key: String) -> Bool. Ansonsten macht es mehr Sinnreturn self.object(forKey: key) != nil
Nomad Developer

5

Einfacher Code, um zu überprüfen, ob der Wert in UserDefault gespeichert ist.

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

für schnelle 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
        }
    }

}

Oder Sie können diese Bibliothek ausprobieren: Link


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

   return true;
}

Bitte posten Sie nicht nur Code als Antwort, sondern geben Sie auch eine Erklärung, was Ihr Code tut und wie er die Frage beantwortet. Antworten mit einer Erklärung sind in der Regel hilfreicher und von besserer Qualität und ziehen eher positive Stimmen an.
Mark Rotteveel

0

überschreiben func 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")


}

0

Viele der hier aufgeführten Lösungen sind gültig. Trotzdem denke ich, dass sie das falsche Problem lösen.

Normalerweise wird Code wie dieser verwendet, um zu überprüfen, ob ein Wert festgelegt ist, damit ein anderer Standardwert verwendet werden kann:

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

Es sollte Ihnen egal sein, ob ein Schlüssel gesetzt ist oder nicht. Es gibt einen weitaus eleganteren Ansatz für Standardwerte in UserDefaults:

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

Wenn Sie diesen Code beim Start der App ausführen, geben nachfolgende Aufrufe von UserDefaults.standard.string(forKey: "username")den Standardwert zurück, "No username was set"wenn für den Schlüssel noch kein Wert festgelegt wurde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.