UserDefault'un var olup olmadığını kontrol edin - Swift


87

Aşağıda görülen bir kullanıcı varsayılanının olup olmadığını kontrol etmeye çalışıyorum:

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Bununla birlikte, nesne henüz mevcut olmadığında bile her zaman doğruya dönecek ne olursa olsun? Varoluşu kontrol etmenin doğru yolu bu mu?

Yanıtlar:


129

Astun'un harika bir cevabı var. Swift 3 sürümü için aşağıya bakın.

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

29

Kodunuzu kopyaladım / yapıştırdım ama Xcode 6.1.1 bazı hataları yoluma atıyordu, böyle görünmeye başladı ve harika çalışıyor. Teşekkürler!

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

Çalıştı! Ama parametreyi unuttun, ben de ekledim.
Jesse Onolemen

21

Evet bu doğru kontrol etmek yoludur optionalvar nilya da herhangi bir değer objectForKeyyöntemi döndürür AnyObject?olduğu Implicit optional.

Öyleyse, userDefaults.objectForKey(kUSERID)değerlendirdiğinden daha değerli bir değer varsa true. değerine sahipse userDefaults.objectForKey(kUSERID), nildeğerlendirdiğinden false.

Hızlı programlama kılavuzundan

If İfadeleri ve Zorla Unwrapping İsteğe bağlı bir değer içerip içermediğini öğrenmek için bir if ifadesi kullanabilirsiniz. İsteğe bağlı bir değer varsa, doğru olarak değerlendirilir; hiç değeri yoksa, yanlış olarak değerlendirilir.

Simülatörlerde userDefaults, uygulamanızı silseniz de her zaman ayarlanmış olarak kaldıkları için anahtar ayarlandıktan sonra bir hata var. Simülatörü sıfırlamanız gerekiyor.

Senin Simülatörü Reset anahtarı ayarlamadan önce bu yöntemi kontrol userDefaultsveya anahtarı kaldırmak userDefaults.removeObjectForKey(kUSERID)gelen userDefaults ve onu dönecektir NOiçeri çözüldükten oranıdır.Otel cihazlar iOS8 beta4.


" Örtük isteğe bağlı objectForKeyyöntem döndürür AnyObject!" Bu yanlıştırAnyObject?
Leo Dabus

1
@LeoDabus Swift pek çok kez değişti. Teşekkürler BTW Bunu değiştirdim.
codester

25/10/2016 itibarıyla dokümanlardaki satırda artık "İsteğe bağlı olanı nil ile karşılaştırarak isteğe bağlı bir değer içerip içermediğini öğrenmek için bir if ifadesi kullanabilirsiniz. Bu karşılaştırmayı" eşittir "operatörü (= =) veya "eşit değildir" operatörü (! =). " Xcode 7.3.1, denerseniz bir derleme hatası gösterecek if anOptional { }ve == nil veya! = Nil
wyu 25'16

14

Bu, esasen diğer yanıtlarda önerilenle aynıdır, ancak daha uygun bir şekilde (Swift 3+):

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

kullanım: if UserDefaults.contains(kUSERID) { ... }


o zaman bir tekil erişen çünkü fonksiyon statik hale getirmek için mantıklı standardı : static func contains(key: String) -> Bool. Aksi takdirde, yapmak daha mantıklıreturn self.object(forKey: key) != nil
Nomad Developer

5

Değerin UserDefault'ta depolanıp depolanmadığını kontrol etmek için Basit Kod.

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

hızlı 3.2 için

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

}

Veya bu kitaplığı deneyebilirsiniz: Bağlantı


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

   return true;
}

Lütfen yanıt olarak yalnızca kodu göndermeyin, aynı zamanda kodunuzun ne yaptığını ve soruyu nasıl yanıtladığını da açıklayın. Açıklamalı yanıtlar genellikle daha yararlıdır ve daha kalitelidir ve olumlu oyları alma olasılığı daha yüksektir.
Mark Rotteveel

0

override func viewDidLoad () {

super.viewDidLoad ()

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

Buradaki çözümlerin çoğu geçerlidir. Yine de yanlış sorunu çözdüklerini düşünüyorum.

Genellikle, bunun gibi bir kod, bir değerin ayarlanıp ayarlanmadığını kontrol etmek için kullanılır, böylece başka bir varsayılan değer kullanılabilir:

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

Bir anahtarın ayarlanmış olup olmadığı umrunda olmamalıdır. Varsayılan değerlere sahip olmak için çok daha zarif bir yaklaşım var UserDefaults:

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

Bu kodu uygulama başlatılırken çalıştırırsanız, için yapılan sonraki çağrılar , anahtar için henüz bir değer ayarlanmadıysa UserDefaults.standard.string(forKey: "username")varsayılan değeri döndürür "No username was set".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.