Sprawdź, czy istnieje UserDefault - Swift


87

Próbuję sprawdzić, czy istnieje domyślne ustawienie użytkownika, widoczne poniżej:

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Jednak nie ma znaczenia, co zawsze zwróci prawdę, nawet jeśli obiekt jeszcze nie istnieje? Czy to właściwy sposób sprawdzania istnienia?

Odpowiedzi:


129

Astun ma świetną odpowiedź. Zobacz poniżej wersję Swift 3.

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

29

Skopiowałem / wkleiłem Twój kod, ale Xcode 6.1.1 rzucał kilka błędów na mój sposób, skończyło się tak, że wyglądało tak i działa jak urok. Dzięki!

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

Pracowałem! Ale zapomniałeś parametru, więc dodałem go.
Jesse Onolemen

21

Tak, jest to właściwy sposób sprawdzenia optional, nilczy objectForKeymetoda ma lub zwraca jakąkolwiek metodę wartości , AnyObject?która jest Implicit optional.

Więc jeśli userDefaults.objectForKey(kUSERID)ma jakąkolwiek wartość, niż szacuje true. jeśli userDefaults.objectForKey(kUSERID)ma nilwartość, do której się szacuje false.

Z szybkiego przewodnika programowania

Instrukcje if i wymuszone rozpakowywanie Można użyć instrukcji if, aby sprawdzić, czy opcja opcjonalna zawiera wartość. Jeśli opcjonalny ma wartość, przyjmuje wartość true; jeśli nie ma żadnej wartości, przyjmuje wartość fałsz.

Teraz w symulatorach jest błąd, że po ustawieniu klucza userDefaultszawsze pozostają ustawione bez względu na to, czy usuniesz aplikację. Musisz zresetować symulator.

Zmień Simulator sprawdzić tę metodę przed ustawieniem klucz userDefaultslub wyjąć kluczyk userDefaults.removeObjectForKey(kUSERID)z userDefaults nastąpi powrót NOurządzenia .Na to jest rozwiązane w iOS8 beta4.


" objectForKeymetoda zwraca, AnyObject!która jest Niejawna opcjonalna" To źle, zwracaAnyObject?
Leo Dabus

1
@LeoDabus Swift zmieniał się wiele razy. Dzięki BTW, zmieniłem to.
kodester

od 25.10.2016 wiersz w dokumentach zawiera teraz tekst „Możesz użyć instrukcji if, aby dowiedzieć się, czy opcja opcjonalna zawiera wartość, porównując wartość opcjonalną z zerem. Porównanie to wykonuje się za pomocą operatora„ równa się ”(= =) lub operator „nie równa się” (! =). " Xcode 7.3.1 wyświetli błąd kompilacji, jeśli spróbujesz, if anOptional { }i zasugeruje przetestowanie przy użyciu == nil lub! =
Nil

15

Jest to zasadniczo to samo, co sugerowano w innych odpowiedziach, ale w wygodniejszy sposób (Swift 3+):

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

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


to ma sens, aby funkcji statycznych, bo masz dostępu singleton standardu : static func contains(key: String) -> Bool. W przeciwnym razie ma większy sensreturn self.object(forKey: key) != nil
Nomad Developer

5

Prosty kod, aby sprawdzić, czy wartość jest przechowywana w 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

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

}

Lub możesz wypróbować tę bibliotekę: Link


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

   return true;
}

Nie wysyłaj tylko kodu jako odpowiedzi, ale także wyjaśnij, co robi twój kod i jak odpowiada na pytanie. Odpowiedzi z wyjaśnieniem są zwykle bardziej pomocne i lepszej jakości oraz częściej przyciągają głosy za.
Mark Rotteveel

0

override 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

Wiele z przedstawionych tutaj rozwiązań jest poprawnych. Mimo to myślę, że rozwiązują zły problem.

Zwykle taki kod służy do sprawdzenia, czy wartość jest ustawiona, aby można było użyć innej wartości domyślnej:

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

Nie powinno cię obchodzić, czy klucz jest ustawiony, czy nie. Istnieje znacznie bardziej eleganckie podejście do posiadania wartości domyślnych w UserDefaults:

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

Jeśli uruchomisz ten kod podczas uruchamiania aplikacji, kolejne wywołania UserDefaults.standard.string(forKey: "username")zwrócą domyślną wartość, "No username was set"jeśli nie ustawiono jeszcze żadnej wartości dla klucza.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.