मैं स्विफ्ट में UserDefaults का उपयोग कैसे कर सकता हूं?


119

मैं स्विफ्ट में स्ट्रिंग्स, बूलियन और अन्य डेटा को बचाने / पुनः प्राप्त करने के लिए UserDefaults का उपयोग कैसे कर सकता हूं?


4
मैं इस प्रश्न को फिर से खोल रहा हूं क्योंकि यह इस विषय पर एक अच्छे सामान्य प्रश्न के रूप में काम कर सकता है। स्वीकृत उत्तर पिछले चिह्नित डुप्लिकेट की तुलना में अधिक स्पष्ट है , जो इस प्रश्न से भी अधिक विशिष्ट था।
2


मुझे लगता है कि यह सवाल स्टैक ओवरफ्लो में उपलब्ध है जिसे आपको यहां जोड़ने से पहले खोजना चाहिए
योगेश पटेल

जवाबों:


329

रेफरी: NSUserdefault ऑब्जेक्टटाइप्स

स्विफ्ट 3 और इसके बाद के संस्करण

दुकान

UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key")  //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject

पुन: प्राप्त करें

 UserDefaults.standard.bool(forKey: "Key")
 UserDefaults.standard.integer(forKey: "Key")
 UserDefaults.standard.string(forKey: "Key")

हटाना

 UserDefaults.standard.removeObject(forKey: "Key")

सभी कीज निकालें

 if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
 }

स्विफ्ट 2 और नीचे

दुकान

NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()

पुन: प्राप्त करें

  var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]

हटाना

 NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")


रजिस्टर करें

registerDefaults: हर खोज सूची में पंजीकरण आइटम को अंतिम आइटम में जोड़ता है। इसका मतलब यह है कि NSUserDefaults के बाद हर दूसरे वैध स्थान में एक मूल्य की तलाश की गई है, यह पंजीकृत चूक में दिखेगा, जिससे उन्हें "कमबैक" मूल्य के रूप में उपयोगी हो जाएगा। पंजीकृत डिफॉल्ट्स को किसी एप्लिकेशन के रन के बीच कभी संग्रहीत नहीं किया जाता है, और केवल उस एप्लिकेशन को दिखाई देता है जो उन्हें पंजीकृत करता है।

डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइलों से डिफ़ॉल्ट मान स्वचालित रूप से पंजीकृत होंगे।

उदाहरण के लिए लॉन्च से ऐप का पता लगाएं, सेव लॉन्च के लिए स्ट्रक्चर बनाएं

struct DetectLaunch {
static let keyforLaunch = "validateFirstlunch"
static var isFirst: Bool {
    get {
        return UserDefaults.standard.bool(forKey: keyforLaunch)
    }
    set {
        UserDefaults.standard.set(newValue, forKey: keyforLaunch)
    }
}
}

एप्लिकेशन लॉन्च पर डिफ़ॉल्ट मान पंजीकृत करें:

UserDefaults.standard.register(defaults: [
        DetectLaunch.isFirst: true
    ])

एप्लिकेशन समाप्ति पर मान निकालें:

func applicationWillTerminate(_ application: UIApplication) {
    DetectLaunch.isFirst = false

}

और स्थिति की जाँच करें

if DetectLaunch.isFirst {
  // app launched from first
}

UserDefaults सुइट नाम

एक अन्य प्रॉपर्टी सुइट नाम , जिसका उपयोग ज्यादातर ऐप ग्रुप कॉन्सेप्ट के लिए किया जाता है , उदाहरण उदाहरण जो मैंने यहां से लिया है :

उपयोग का मामला यह है कि मैं Android के SharedPreferences की तरह एक पहचानकर्ता द्वारा अपने UserDefaults (अलग-अलग व्यावसायिक तर्क को अलग-अलग समूहीकृत किए जाने की आवश्यकता हो सकती है) को अलग करना चाहता हूं। उदाहरण के लिए, जब मेरे ऐप में कोई उपयोगकर्ता लॉगआउट बटन पर क्लिक करता है, तो मैं उसके खाते से संबंधित चूक को साफ़ करना चाहता हूं, लेकिन डिवाइस का स्थान नहीं।

let user = UserDefaults(suiteName:"User")

userDefaults का उपयोग सिंक्रनाइज़ हो जाता है, डुप्लिकेट उत्तर में विस्तार से जानकारी जोड़ी गई है।


आपको स्टोर विधियों को कब और कहां कॉल करना चाहिए? ऐप के बंद होने से पहले या हर बार मान बदलने के बाद?
जोसेफ

बहुत बढ़िया, सभी प्रकार के संचालन के लिए एक जगह।
माइकेल पीटरसन

@ Anbu.Karthik आप userdefaults में कुंजी के लिए मूल्य कैसे अपडेट करेंगे?
सथ्य चिन्नास्वामी

2
@RajeshBaidya - userdefault हमेशा अंतिम मूल्य को ही संग्रहीत करता है
Anbu.Karthik

क्या यह डेटा ऐप इंस्टॉलेशन / अनइंस्टॉल के माध्यम से बना रहता है?
ऑरेंजपॉट

40

UserDefaults का उपयोग करने का सर्वोत्तम तरीका

कदम

  1. UserDefaults का एक्सटेंशन बनाएं
  2. स्थानीय में संग्रहीत करने के लिए आवश्यक कुंजी के साथ एनम बनाएं
  3. आप जहां चाहें स्थानीय डेटा को स्टोर और पुनः प्राप्त कर सकते हैं

नमूना

extension UserDefaults{

    //MARK: Check Login
    func setLoggedIn(value: Bool) {
        set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)
        //synchronize()
    }

    func isLoggedIn()-> Bool {
        return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)
    }

    //MARK: Save User Data
    func setUserID(value: Int){
        set(value, forKey: UserDefaultsKeys.userID.rawValue)
        //synchronize()
    }

    //MARK: Retrieve User Data
    func getUserID() -> Int{
        return integer(forKey: UserDefaultsKeys.userID.rawValue)
    }
}

कीम के लिए enum डेटा को स्टोर करने के लिए उपयोग किया जाता है

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}

जहाँ आप चाहते हैं UserDefaults में सेव करें

UserDefaults.standard.setLoggedIn(value: true)          // String
UserDefaults.standard.setUserID(value: result.User.id!) // String

एप्लिकेशन में कहीं भी डेटा पुनर्प्राप्त करें

print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()

मान निकालें

UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID) 

इस तरह से आप आदिम डेटा को सर्वश्रेष्ठ रूप में संग्रहीत कर सकते हैं

अपडेट आपको मूल्यों को संग्रहीत करने के लिए किसी सिंक्रनाइज़ेशन () का उपयोग करने की आवश्यकता नहीं है। जैसा कि @Moritz ने इसे अनावश्यक बताया और इसके बारे में लेख दिया। अधिक विवरण के लिए टिप्पणियाँ देखें


आप की जरूरत नहीं है synchronize(), यह प्रलेखन में समझाया गया है। यह न केवल यहां बेकार है, बल्कि डिफॉल्ट की पहुंच को धीमा कर सकता है।
एरिक आया

हाँ, यह डॉक्टर में उल्लिखित है। एक बार डिफ़ॉल्ट डेटा बदल जाने के बाद यह अपने आप सहेज जाएगा लेकिन कुछ मामलों में आपके मानों को अतुल्यकालिक रूप से संग्रहीत नहीं किया जा सकता है। इसलिए मैंने इसके सिंक करना बेहतर समझा।
at श्रीनिवासन

2
यह बेहतर नहीं है - यह कभी-कभी मुद्दों का स्रोत भी है। सिंक का उपयोग न करें, यह अप्रचलित और समस्याग्रस्त है। देखें codingexplorer.com/nsuserdefaults-a-swift-introduction विशेष रूप से "अद्यतन" भाग। मैंने इस बारे में कई परीक्षण भी चलाए और अपने सभी ऐप्स में सिंक करने के लिए सभी कॉल हटा दिए और कभी भी गंभीर परिस्थितियों में भी कोई समस्या नहीं हुई। लेकिन हे, अगर आप बेकार सामान पसंद करते हैं जो आपके ऐप को धीमा कर सकता है, तो सिंक को कॉल करें ... सुनिश्चित करें ...;)
एरिक आया

यह वास्तव में उपयोगी है। मैंने सिंक () में टिप्पणी की है। सिंक का उपयोग करना () जरूरत पर आधारित है।
at श्रीनिवासन

hii स्विफ्ट में एक अलग फ़ाइल में nsuserdefaults में डेटा को कैसे बचाया जाए
दिलीप तिवारी

15

स्विफ्ट 4 :

दुकान

    UserDefaults.standard.set(object/value, forKey: "key_name")

पुनर्प्राप्त

    var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]

हटाना

    UserDefaults.standard.removeObject(forKey:"key_name") 

वैकल्पिक के रूप में इस पंक्ति 'UserDefaults.standard.synchronize ()' से आपका क्या तात्पर्य है? @ निकुंज जोशी
निषाद अरोरा


2

आप NSUserDefaultsइस तरह से स्विफ्ट में उपयोग कर सकते हैं ,

@IBAction func writeButton(sender: UIButton)
{
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setObject("defaultvalue", forKey: "userNameKey")

}

@IBAction func readButton(sender: UIButton)
{
    let defaults = NSUserDefaults.standardUserDefaults()
    let name = defaults.stringForKey("userNameKey")
    println(name) //Prints defaultvalue in console
}

2
इस पोस्ट के पहले संस्करण में कहा गया है कि बदलावों का ब्लॉक करने के बाद यह सुनिश्चित करने के लिए कि आपका सामान बच गया है , synchronize()कमांड का उपयोग NSUserDefaultsकरें। आईओएस 7 और उससे पहले में यह अधिक आवश्यक हो सकता है, लेकिन आईओएस 8 और इसके अलावा, आपको ज्यादातर स्थितियों में सिंक्रोनाइज़ () नहीं करना चाहिए। अधिक जानकारी के लिए इसे देखें: codingexplorer.com/nsuserdefaults-a-swift-introduction
Dharmesh Kheni

2

स्विफ्ट 5 और उससे अधिक:

let defaults = UserDefaults.standard

defaults.set(25, forKey: "Age")
let savedInteger = defaults.integer(forKey: "Age")

defaults.set(true, forKey: "UseFaceID")
let savedBoolean = defaults.bool(forKey: "UseFaceID")

defaults.set(CGFloat.pi, forKey: "Pi")
defaults.set("Your Name", forKey: "Name")
defaults.set(Date(), forKey: "LastRun")


let array = ["Hello", "World"]
defaults.set(array, forKey: "SavedArray")


let savedArray = defaults.object(forKey: "SavedArray") as? [String] ?? [String()

let dict = ["Name": "Your", "Country": "YourCountry"]
defaults.set(dict, forKey: "SavedDict")

let savedDictionary = defaults.object(forKey: "SavedDictionary") as? [String: String] ?? [String: String]()

:)


1

मैंने एनएसडॉर को सामान्य रूप से बचाया और इसे सही ढंग से प्राप्त करने में सक्षम था।

 dictForaddress = placemark.addressDictionary! as NSDictionary
        let userDefaults = UserDefaults.standard
        userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)

// NS सहकर्मी से डेटा प्राप्त करने के लिए।

let userDefaults = UserDefaults.standard
    let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary

आपकी मदद के लिए धन्यवाद। :)
वेंकटेश

1
class UserDefaults_WorstPresidentName {
    static let key = "appname.worstPresidentName"

    static var value: String? {
        get {
            return UserDefaults.standard.string(forKey: key)
        }
        set {
            if newValue != nil {
                UserDefaults.standard.set(newValue, forKey: key)
            } else {
                UserDefaults.standard.removeObject(forKey: key)
            }
        }
    }
}

1

UserDefault + Helper.swift

import UIKit

private enum Defaults: String {
   case countryCode = "countryCode"
   case userloginId   = "userloginid"
}

final class UserDefaultHelper {

static var countryCode: String? {
    set{
        _set(value: newValue, key: .countryCode)
    } get {
        return _get(valueForKay: .countryCode) as? String ?? ""
    }
}

static var userloginId: String? {
    set{
        _set(value: newValue, key: .userloginId)
    } get {
        return _get(valueForKay: .userloginId) as? String ?? ""
    }
}

private static func _set(value: Any?, key: Defaults) {
    UserDefaults.standard.set(value, forKey: key.rawValue)
}

private static func _get(valueForKay key: Defaults)-> Any? {
    return UserDefaults.standard.value(forKey: key.rawValue)
}

static func deleteCountryCode() {
    UserDefaults.standard.removeObject(forKey: Defaults.countryCode.rawValue)
 }

static func deleteUserLoginId() {
    UserDefaults.standard.removeObject(forKey: Defaults.userloginId.rawValue)
 }
}

उपयोग:

मान सहेजें:

UserDefaultHelper.userloginId = data["user_id"] as? String

फ़ेच मान:

let userloginid = UserDefaultHelper.userloginId

मान हटाएं:

UserDefaultHelper.deleteUserLoginId()

1

मैं अंबु का जवाब कहूंगा पूरी तरह से ठीक है, लेकिन मुझे अपने कार्यक्रम को विफल करने के लिए वरीयताओं को प्राप्त करते समय गार्ड को जोड़ना पड़ा

यहां स्विफ्ट 5 में अपडेटेड कोड स्निप है

UserDefaults में डेटा संग्रहीत करना

@IBAction func savePreferenceData(_ sender: Any) {
        print("Storing data..")
        UserDefaults.standard.set("RDC", forKey: "UserName") //String
        UserDefaults.standard.set("TestPass", forKey: "Passowrd")  //String
        UserDefaults.standard.set(21, forKey: "Age")  //Integer

    }

UserDefaults से डेटा प्राप्त करना

    @IBAction func fetchPreferenceData(_ sender: Any) {
        print("Fetching data..")

        //added guard
        guard let uName = UserDefaults.standard.string(forKey: "UserName") else { return }
        print("User Name is :"+uName)
        print(UserDefaults.standard.integer(forKey: "Age"))
    }

0

कक्षा में A, कुंजी के लिए सेट मान:

let text = "hai"  
UserDefaults.standard.setValue(text, forKey: "textValue")

कक्षा में B, उस कुंजी का उपयोग करके पाठ के लिए मूल्य प्राप्त करें जो कक्षा में घोषित किया गया है Aऔर इसे संबंधित चर पर असाइन करें जिसकी आपको आवश्यकता है:

var valueOfText  = UserDefaults.value(forKey: "textValue")

0

स्विफ्ट 4, मैंने EnD का उपयोग UserDefaults को संभालने के लिए किया है।

यह सिर्फ एक नमूना कोड है। आप अपनी आवश्यकताओं के अनुसार इसे अनुकूलित कर सकते हैं।

स्टोरिंग, रिट्रीविंग, रिमूवल के लिए। इस तरह बस एनम के लिए अपने UserDefaults कुंजी के लिए एक कुंजी जोड़ें। डेटा टाइप और अपनी आवश्यकताओं के अनुसार भंडारण करते समय मूल्यों को संभालें।

enum UserDefaultsConstant : String {
    case AuthToken, FcmToken

    static let defaults = UserDefaults.standard


   //Store
    func setValue(value : Any) {
        switch self {
        case .AuthToken,.FcmToken:
            if let _ = value as? String {
                UserDefaults.standard.set(value, forKey: self.rawValue)
            }
            break
        }

        UserDefaults.standard.synchronize()
    }

   //Retrieve
    func getValue() -> Any? {
        switch self {
        case .AuthToken:
            if(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) != nil) {

                return "Bearer "+(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) as! String)
            }
            else {
                return ""
            }

        case .FcmToken:

            if(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) != nil) {
                print(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue))
                return (UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) as! String)
            }
            else {
                return ""
            }
        }
    }

    //Remove
    func removeValue() {
        UserDefaults.standard.removeObject(forKey: self.rawValue)
        UserDefaults.standard.synchronize()
    }
}

Userdefaults में मान संग्रहीत करने के लिए,

if let authToken = resp.data?.token {
     UserDefaultsConstant.AuthToken.setValue(value: authToken)
    }

Userdefaults से मान प्राप्त करने के लिए,

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.