Перевірте, чи існує UserDefault - Swift


87

Я намагаюся перевірити, чи існує за замовчуванням користувач, як показано нижче:

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Однак немає жодної матері, що воно завжди повернеться істинним, навіть коли об’єкт ще не існує? Це правильний спосіб перевірити існування?

Відповіді:


128

Астун має чудову відповідь. Дивіться нижче версію Swift 3.

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

29

Я скопіював / вставив ваш код, але Xcode 6.1.1 видавав деякі помилки в мій спосіб, це в кінцевому підсумку виглядало так, і це працює як шарм. Дякую!

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

Працювали! Але ви забули параметр, тому я додав його.
Джессі Онолемен,

21

Так, це правильний спосіб перевірити optionalнаявність nilабо будь-який objectForKeyметод повернення методу, AnyObject?який є Implicit optional.

Тож якщо userDefaults.objectForKey(kUSERID)має якесь значення, ніж воно оцінює true. якщо userDefaults.objectForKey(kUSERID)має nilзначення, ніж воно оцінює false.

З швидкого посібника з програмування

Якщо виписки та примусове розгортання Ви можете використовувати оператор if, щоб з’ясувати, чи містить необов’язкове значення. Якщо необов’язковий елемент має значення, він оцінюється як істина; якщо воно взагалі не має значення, воно оцінюється як false.

Зараз у симуляторах є помилка, ніж після встановлення ключа, userDefaultsвони завжди залишаються встановленими, незалежно від того, чи ви видаляєте програму. Вам потрібно скинути симулятор.

Скинути Simulator перевірити цей метод перед установкою ключа в userDefaultsабо вийняти ключ userDefaults.removeObjectForKey(kUSERID)із userDefaults і він буде повертати NO.А пристрій воно дозволена iOS8 beta4.


" objectForKeyметод повертає AnyObject!неявний необов’язковий" Це неправильно, він повертаєAnyObject?
Лео Дабус

1
@LeoDabus Swift стільки разів змінювався. Дякую, до речі, я змінив це.
кодестер

станом на 25.10.2016 у рядку в документації тепер написано: "Ви можете використовувати оператор if, щоб з’ясувати, чи містить необов’язкове значення, порівнюючи необов’язковий із нулем. Ви виконуєте це порівняння з оператором„ дорівнює "(= =) або оператор “не дорівнює” (! =). " Xcode 7.3.1 покаже помилку компіляції, якщо ви спробуєте це зробити, if anOptional { }і він запропонує вам перевірити, використовуючи == nil або! =
Nil

14

По суті, це те саме, що пропонується в інших відповідях, але більш зручним способом (Swift 3+):

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

використання: if UserDefaults.contains(kUSERID) { ... }


то має сенс зробити функцію статичної , тому що ви звертаєтеся одноелементний стандарт : static func contains(key: String) -> Bool. В іншому випадку це має сенс робитиreturn self.object(forKey: key) != nil
розробник Nomad

5

Простий код, щоб перевірити, чи зберігається значення в 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")
}


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

}

Або ви можете спробувати цю бібліотеку: Посилання


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

   return true;
}

Будь ласка, не публікуйте лише код як відповідь, але також надайте пояснення, що робить ваш код і як він відповідає на запитання. Відповіді з поясненнями, як правило, є більш корисними та якісними, і, швидше за все, залучають прихильників.
Марк Роттівел

0

перевизначити функцію 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

Багато з наведених тут рішень є дійсними. І все-таки я думаю, що вони вирішують неправильну проблему.

Зазвичай такий код використовується для перевірки, чи встановлено значення, щоб можна було використовувати інше значення за замовчуванням:

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

Вам не має бути все одно, встановлено клавішу чи ні. Існує набагато більш елегантний підхід до встановлення значень за замовчуванням у UserDefaults:

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

Якщо ви запустите цей код під час запуску програми, наступні виклики до UserDefaults.standard.string(forKey: "username")повернуть значення за замовчуванням, "No username was set"якщо для ключа ще не встановлено значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.