जांचें कि क्या UserDefault मौजूद है - स्विफ्ट


87

यदि कोई उपयोगकर्ता डिफ़ॉल्ट मौजूद है, तो नीचे देख रहा हूं:

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

हालाँकि, कोई मैटर नहीं है कि यह हमेशा तब भी सही होगा जब ऑब्जेक्ट अभी तक मौजूद नहीं है? क्या यह अस्तित्व की जाँच का सही तरीका है?

जवाबों:


129

अस्सुत का बड़ा अच्छा उत्तर है। स्विफ्ट 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

स्विफ्ट प्रोग्रामिंग गाइड से

यदि स्टेटमेंट और जबरन अनवापिंग आप एक स्टेटमेंट का उपयोग यह पता लगाने के लिए कर सकते हैं कि क्या वैकल्पिक में कोई मान है। यदि किसी वैकल्पिक का मान होता है, तो यह सत्य का मूल्यांकन करता है; यदि इसका कोई मूल्य नहीं है, तो यह असत्य का मूल्यांकन करता है।

अब सिमुलेटरों में एक बग होता है जिसमें कुंजी सेट करने के बाद userDefaultsवे हमेशा सेट रहते हैं कोई फर्क नहीं पड़ता कि आप अपना ऐप हटा दें। आपको सिम्युलेटर रीसेट करने की आवश्यकता है।

अपने सिम्युलेटर को रीसेट करें कुंजी सेट करने से पहले इस विधि की जांच करें userDefaultsया इसमें से कुंजी userDefaults.removeObjectForKey(kUSERID)को हटा दें userDefaults और यह वापस आ जाएगा NO। डिवाइसों में इसे हल किया जाता है iOS8 beta4


" objectForKeyमेथड रिटर्न AnyObject!AnyObject?
इम्प्लिक्ट अल्टरनेटिव

1
@LeoDabus स्विफ्ट इतनी बार बदल गई है। धन्यवाद BTW मैंने इसे बदल दिया है।
कोडेस्टर

10/25/2016 के अनुसार डॉक्स में लाइन अब कहती है "आप एक स्टेटमेंट का उपयोग यह पता लगाने के लिए कर सकते हैं कि क्या वैकल्पिक में एनआईएल के खिलाफ वैकल्पिक की तुलना करके कोई मान है। आप यह तुलना" ऑपरेटर "(=) के बराबर करते हैं। =) या "ऑपरेटर (! =) के बराबर नहीं"। यदि आप कोशिश करते हैं तो Xcode 7.3.1 एक संकलन त्रुटि दिखाएगा if anOptional { }और यह आपको == nil या! =
Nil

15

यह अनिवार्य रूप से अन्य उत्तरों में सुझाया गया है, लेकिन अधिक सुविधाजनक तरीके से है (स्विफ्ट 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
खानाबदोश डेवलपर

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

कृपया केवल कोड को उत्तर के रूप में पोस्ट न करें, बल्कि यह भी स्पष्टीकरण दें कि आपका कोड क्या करता है और यह प्रश्न का उत्तर कैसे देता है। एक स्पष्टीकरण के साथ उत्तर आमतौर पर अधिक सहायक और बेहतर गुणवत्ता के होते हैं, और upvotes को आकर्षित करने की अधिक संभावना होती है।
मार्क रोटेवेल

0

ओवरराइड दुर्गंध दृश्यडीडलड () {

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

यहां के कई समाधान मान्य हैं। फिर भी, मुझे लगता है कि वे गलत समस्या को हल करते हैं।

आमतौर पर, इस तरह के कोड का उपयोग यह जांचने के लिए किया जाता है कि क्या मूल्य निर्धारित किया गया है, इसलिए किसी अन्य डिफ़ॉल्ट मान का उपयोग किया जा सकता है:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.