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?
ios
swift
nsuserdefaults
Ryan
źródło
źródło
Tak, jest to właściwy sposób sprawdzenia
optional
,nil
czyobjectForKey
metoda ma lub zwraca jakąkolwiek metodę wartości ,AnyObject?
która jestImplicit optional
.Więc jeśli
userDefaults.objectForKey(kUSERID)
ma jakąkolwiek wartość, niż szacujetrue
. jeśliuserDefaults.objectForKey(kUSERID)
manil
wartość, do której się szacujefalse
.Z szybkiego przewodnika programowania
Teraz w symulatorach jest błąd, że po ustawieniu klucza
userDefaults
zawsze pozostają ustawione bez względu na to, czy usuniesz aplikację. Musisz zresetować symulator.Zmień Simulator sprawdzić tę metodę przed ustawieniem klucz
userDefaults
lub wyjąć kluczykuserDefaults.removeObjectForKey(kUSERID)
zuserDefaults
nastąpi powrótNO
urządzenia .Na to jest rozwiązane wiOS8 beta4
.źródło
objectForKey
metoda zwraca,AnyObject!
która jest Niejawna opcjonalna" To źle, zwracaAnyObject?
if anOptional { }
i zasugeruje przetestowanie przy użyciu == nil lub! =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) { ... }
źródło
static func contains(key: String) -> Bool
. W przeciwnym razie ma większy sensreturn self.object(forKey: key) != nil
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") }
źródło
dla szybkiej 3.2
func userAlreadyExist(kUsernameKey: String) -> Bool { return UserDefaults.standard.object(forKey: kUsernameKey) != nil }
źródło
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
źródło
func keyExists(key: String) -> Bool { guard let _ = UserDefaults.standard.object(forKey: key) { return false; } return true; }
źródło
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") }
źródło
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.źródło