SwiftUI में @AppStorage — यह क्या है, UserDefaults और सेटिंग्स स्टोरेज

लेखक: IT Sectr प्रकाशित: 2026-06-25 पढ़ने का समय: 7 मिनट

SwiftUI में @AppStorage एक property wrapper है जो UserDefaults के साथ काम करने के लिए है और स्वचालित रूप से मान को UI से सिंक करता है। @AppStorage के माध्यम से घोषित प्रॉपर्टी बदलने पर, नया मान तुरंत UserDefaults में सेव हो जाता है, और जब UserDefaults बाहरी रूप से — विजेट या एक्सटेंशन द्वारा — बदलता है, तो View स्वचालित रूप से रीड्रा हो जाता है। Apple Developer Documentation (2025) के अनुसार, @AppStorage String, Int, Double, Bool, Data, URL और उनके ऑप्शनल वर्जन को सपोर्ट करता है, बिना मैन्युअल ऑब्ज़र्वेशन कोड के यूज़र सेटिंग्स का रिएक्टिव स्टोरेज प्रदान करता है।

मुख्य बिंदु

  • @AppStorage — SwiftUI में UserDefaults के साथ रिएक्टिव काम के लिए property wrapper
  • ऑटो-सेव — हर बदलाव पर मान UserDefaults में लिखा जाता है
  • ऑटो-अपडेट UI — किसी भी स्रोत से UserDefaults बदलने पर View रीड्रा होता है
  • समर्थित प्रकार: String, Int, Double, Bool, Data, URL और ऑप्शनल वर्जन
  • डिफ़ॉल्ट मान घोषणा में सेट किया जाता है और पहले लॉन्च पर उपयोग होता है

SwiftUI में @AppStorage क्या है?

@AppStorage Apple द्वारा iOS 14 में पेश किया गया एक property wrapper है जो View प्रॉपर्टी को UserDefaults की एक कुंजी से बाँधता है। प्रॉपर्टी पढ़ने पर, SwiftUI निर्दिष्ट कुंजी द्वारा UserDefaults से मान लोड करता है। लिखने पर, नया मान सेव करता है और View को रीड्रा करने की सूचना देता है।

@AppStorage से पहले, डेवलपर्स को onAppear में मैन्युअल रूप से UserDefaults पढ़ना, UserDefaults.didChangeNotification की सदस्यता लेना, और बदलावों पर @State अपडेट करना पड़ता था। @AppStorage पूरे चक्र को स्वचालित करता है: एक-लाइन घोषणा 15–20 लाइनों के boilerplate कोड को बदल देती है। इसके अलावा, @AppStorage द्विदिश सिंक्रनाइज़ेशन प्रदान करता है — यदि UserDefaults मान किसी अन्य प्रक्रिया (जैसे App Extension या Widget) से बदलता है, तो View फिर भी अपडेट प्राप्त करेगा।

आर्किटेक्चरल रूप से, @AppStorage को DynamicProperty के रूप में लागू किया गया है, जो SwiftUI को निर्भरताओं को ट्रैक करने और देखे गए मान में बदलाव पर View को रीड्रा करने की अनुमति देता है। यह इसे यूज़र सेटिंग्स: इंटरफ़ेस भाषा, सुविधाओं को सक्षम/अक्षम करना, अंतिम चयनित टैब, उपयोगकर्ता नाम संग्रहीत करने के लिए आदर्श बनाता है।

@AppStorage vs UserDefaults: तुलना

यद्यपि @AppStorage अंतर्निहित रूप से UserDefaults का उपयोग करता है, स्टोरेज के साथ काम करने के दृष्टिकोण मौलिक रूप से भिन्न हैं। UserDefaults एक निम्न-स्तरीय API है जिसके लिए पढ़ने, लिखने और बदलाव सूचनाओं के मैन्युअल प्रबंधन की आवश्यकता होती है। @AppStorage एक SwiftUI एब्स्ट्रैक्शन है जो बॉक्स से बाहर रिएक्टिव व्यवहार प्रदान करता है।

UserDefaults एकबारगी संचालन के लिए उपयुक्त है: ऐप स्टार्टअप पर सेटिंग्स लोड करना, एनालिटिक्स लिखना, टोकन कैश करना। @AppStorage उन सेटिंग्स के लिए है जिन्हें UI को रिएक्टिव रूप से अपडेट करना चाहिए: थीम टॉगल, भाषा चयन, इंटरफ़ेस स्थिति सहेजना। View के अंदर सीधे UserDefaults का उपयोग करना एक एंटी-पैटर्न है, क्योंकि View अतिरिक्त सदस्यता के बिना बदलावों के बारे में नहीं जानता।

पैरामीटर@AppStorageUserDefaults
प्रतिक्रियाशीलतास्वचालितसूचनाओं की सदस्यता आवश्यक
Boilerplate1 पंक्ति प्रति प्रॉपर्टी15–20 पंक्तियाँ प्रति प्रॉपर्टी
प्रकारString, Int, Double, Bool, Data, URLसभी प्रकार + आर्काइव्ड ऑब्जेक्ट
कस्टम प्रकारRawRepresentable के माध्यम सेNSKeyedArchiver के माध्यम से
App Extensionस्वचालित सिंकमैन्युअल सदस्यता

रिएक्टिव UI वाली सरल सेटिंग्स के लिए @AppStorage पसंदीदा विकल्प है। जटिल डेटा (ऐरे, डिक्शनरी, कस्टम ऑब्जेक्ट) के लिए UserDefaults को @State और मैन्युअल बदलाव सदस्यता के साथ संयोजन में उपयोग करें, या संरचित स्टोरेज के लिए SwiftData / Core Data पर स्विच करें।

समर्थित डेटा प्रकार

@AppStorage मानक प्रकारों का समर्थन करता है जिन्हें UserDefaults सीधे सीरियलाइज़ कर सकता है: String, Int, Double, Bool, Data, URL. प्रत्येक प्रकार के लिए एक ऑप्शनल वर्जन (String?, Int?, Double?, Bool?, Data?, URL?) मौजूद है, जो "सेट नहीं" और "खाली मान" के बीच अंतर करने की अनुमति देता है।

RawRepresentable प्रोटोकॉल का अनुपालन करने वाले कस्टम प्रकारों को संग्रहीत करने के लिए, @AppStorage स्वचालित रूप से भी काम करता है। यदि किसी enum का rawValue String या Int प्रकार का है, तो इसका सीधे उपयोग किया जा सकता है: @AppStorage("theme") var theme: AppTheme = .system. SwiftUI स्वचालित रूप से rawValue के माध्यम से मान को सीरियलाइज़/डीसीरियलाइज़ करता है।

swift
enum AppTheme: String {
    case system, light, dark
}

struct SettingsView: View {
    @AppStorage("username") var username: String = "Guest"
    @AppStorage("launchCount") var launchCount: Int = 0
    @AppStorage("isDarkMode") var isDarkMode: Bool = false
    @AppStorage("appTheme") var theme: AppTheme = .system
    @AppStorage("lastOpened") var lastOpened: Date? = nil

    var body: some View {
        Form {
            TextField("Username", text: $username)
            Toggle("Dark mode", isOn: $isDarkMode)
            Text("\(launchCount) बार लॉन्च किया गया")
        }
    }
}

उदाहरण विभिन्न @AppStorage प्रकारों का उपयोग करता है: डिफ़ॉल्ट मान "Guest" के साथ String, लॉन्च काउंटर के लिए Int, डार्क थीम के लिए Bool, String प्रकार के rawValue के साथ AppTheme enum, और अंतिम खुलने के समय के लिए ऑप्शनल Date?। प्रत्येक प्रॉपर्टी पहले तर्क के रूप में निर्दिष्ट UserDefaults कुंजी से बंधी है। यदि पहले लॉन्च पर कुंजी स्टोरेज में मौजूद नहीं है तो डिफ़ॉल्ट मान उपयोग किया जाता है।

स्टोर में बदलावों का अवलोकन

@AppStorage के प्रमुख लाभों में से एक किसी भी स्रोत से UserDefaults बदलावों का स्वचालित अवलोकन है। यदि कोई App Extension या Widget मान बदलता है, तो पैरेंट ऐप में @AppStorage सूचना प्राप्त करता है और View को रीड्रा करता है। यह KVO (Key-Value Observing) तंत्र के माध्यम से प्राप्त होता है जिसे @AppStorage स्वचालित रूप से UserDefaults.didChangeNotification पर सेट करता है।

व्यवहार में, इसका मतलब है कि यदि उपयोगकर्ता Widget में कोई सेटिंग बदलता है (उदाहरण के लिए, डार्क थीम सक्षम करता है), तो ऐप तुरंत बदलाव को पकड़ लेता है। वही सिंक्रनाइज़ेशन मुख्य ऐप और Share Extension, Watch App या Today Widget के बीच काम करता है। डेवलपर को अंतर-प्रक्रिया डेटा विनिमय के लिए कोड लिखने की आवश्यकता नहीं है — @AppStorage यह स्वचालित रूप से करता है।

swift
struct ThemeSettingView: View {
    @AppStorage("isDarkMode") var isDarkMode: Bool = false

    var body: some View {
        VStack {
            Toggle("Dark Mode", isOn: $isDarkMode)
                .onChange(of: isDarkMode) { oldValue, newValue in
                    print("डार्क मोड बदलकर \(newValue) हो गया")
                }
        }
    }
}

Toggle @AppStorage के माध्यम से $isDarkMode से बंधा है। टॉगल करने पर, मान स्वचालित रूप से "isDarkMode" कुंजी के तहत UserDefaults में सेव हो जाता है। .onChange मॉडिफ़ायर बदलाव पर साइड इफ़ेक्ट करने की अनुमति देता है — उदाहरण के लिए, एनालिटिक्स भेजना या अन्य स्क्रीन का UI अपडेट करना। यदि Widget उसी कुंजी को बदलता है, तो @AppStorage भी onChange को ट्रिगर करेगा, जिससे स्थिति की संगति सुनिश्चित होती है।

@AppStorage कोड उदाहरण

आइए एक पूर्ण ऐप सेटिंग्स स्क्रीन देखें जो सभी कॉन्फ़िगरेशन को संग्रहीत करने के लिए @AppStorage का उपयोग करती है। फ़ॉर्म में विभिन्न प्रकार की सेटिंग्स वाले अनुभाग हैं: टेक्स्ट फ़ील्ड, टॉगल, काउंटर — सभी मान स्वचालित रूप से UserDefaults में सेव होते हैं।

swift
struct AppSettingsView: View {
    @AppStorage("displayName") var displayName = ""
    @AppStorage("notificationsEnabled") var notificationsEnabled = true
    @AppStorage("maxResults") var maxResults = 25
    @AppStorage("selectedTab") var selectedTab = "home"

    var body: some View {
        NavigationStack {
            Form {
                Section(header: Text("प्रोफ़ाइल")) {
                    TextField("Display name", text: $displayName)
                }

                Section(header: Text("प्राथमिकताएँ")) {
                    Toggle("Enable notifications",
                           isOn: $notificationsEnabled)
                    Stepper("Max results: \(maxResults)",
                           value: $maxResults,
                           in: 10...100,
                           step: 5)
                }

                Section {
                    Button("सेटिंग्स रीसेट करें") {
                        UserDefaults.standard.removePersistentDomain(
                            forName: Bundle.main.bundleIdentifier!)
                    }
                    .tint(.red)
                }
            }
            .navigationTitle("Settings")
        }
    }
}

फ़ॉर्म में विभिन्न प्रकारों के चार @AppStorage गुण हैं: नाम के लिए String, सूचनाओं के लिए Bool, परिणामों की संख्या के लिए Int और चयनित टैब के लिए String। सभी नियंत्रण Binding ($displayName, $notificationsEnabled, आदि) के माध्यम से गुणों से बंधे हैं। "Reset settings" बटन ऐप डोमेन को हटाकर सभी UserDefaults को साफ़ करता है — उसके बाद @AppStorage स्वचालित रूप से डिफ़ॉल्ट मानों पर वापस आ जाता है।

App Group के साथ @AppStorage सिंक्रनाइज़ेशन

swift
struct SharedSettingsView: View {
    let sharedDefaults = UserDefaults(suiteName: "group.com.example.app")

    @AppStorage("widgetTheme", store: UserDefaults(suiteName: "group.com.example.app")!)
    var widgetTheme: String = "सिस्टम"

    @AppStorage("widgetColor", store: UserDefaults(suiteName: "group.com.example.app")!)
    var widgetColor: String = "नीला"

    var body: some View {
        Form {
            Picker("Widget theme", selection: $widgetTheme) {
                Text("सिस्टम").tag("system")
                Text("लाइट").tag("लाइट")
                Text("डार्क").tag("डार्क")
            }
            Picker("Accent color", selection: $widgetColor) {
                Text("नीला").tag("blue")
                Text("हरा").tag("हरा")
                Text("लाल").tag("लाल")
            }
        }
    }
}

App Group (ऐप और एक्सटेंशन के बीच साझा स्टोरेज) के लिए @AppStorage store पैरामीटर स्वीकार करता है: UserDefaults(suiteName:)। मान साझा कंटेनर में सेव होते हैं जो मुख्य ऐप, Widget, Watch App और उसी समूह के अन्य एक्सटेंशन के लिए उपलब्ध होता है। Widget इन सेटिंग्स को पढ़ सकता है, और जब वे ऐप में बदलती हैं, तो Widget UserDefaults अवलोकन तंत्र के माध्यम से स्वचालित रूप से अपडेट हो जाता है।

अक्सर पूछे जाने वाले प्रश्न

@AppStorage और @State में क्या अंतर है?

@State मान केवल मेमोरी में संग्रहीत करता है और ऐप पुनरारंभ होने पर रीसेट हो जाता है। @AppStorage मान को UserDefaults में सहेजता है और अगले लॉन्च पर पुनर्स्थापित करता है। अस्थायी स्क्रीन डेटा के लिए @State का उपयोग करें, उन सेटिंग्स के लिए @AppStorage जो पुनरारंभ होने पर बनी रहनी चाहिए।

क्या @AppStorage को Enum के साथ उपयोग किया जा सकता है?

हाँ, यदि Enum String या Int प्रकार के rawValue के साथ RawRepresentable प्रोटोकॉल लागू करता है। उदाहरण: @AppStorage("theme") var theme: AppTheme = .system. SwiftUI स्वचालित रूप से rawValue के माध्यम से enum को सीरियलाइज़ करता है और लोड होने पर पुनर्स्थापित करता है।

सभी @AppStorage मान कैसे साफ़ करें?

मानक स्टोरेज के लिए UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) या किसी विशिष्ट कुंजी के लिए removeObject(forKey:) कॉल करें। साफ़ करने के बाद, सभी @AppStorage गुण घोषणा में निर्दिष्ट डिफ़ॉल्ट मानों पर वापस आ जाएँगे।

क्या @AppStorage App Extensions के साथ काम करता है?

हाँ, ऐप और एक्सटेंशन के बीच सिंक्रनाइज़ेशन के लिए App Group का उपयोग करें: @AppStorage("key", store: UserDefaults(suiteName: "group.com.example.app")!). Widget, Share Extension और Watch App उसी UserDefaults को पढ़ और लिख सकते हैं, और बदलाव स्वचालित रूप से ट्रैक किए जाते हैं।

@AppStorage में कितना डेटा संग्रहीत किया जा सकता है?

@AppStorage UserDefaults का उपयोग करता है, जो छोटी मात्रा के डेटा: सेटिंग्स, टोकन, काउंटर के लिए डिज़ाइन किया गया है। अनुशंसित सीमा प्रति ऐप 100 KB तक है। संरचित या बड़े डेटा (ऑब्जेक्ट ऐरे, मीडिया फ़ाइलें) के लिए SwiftData, Core Data या फ़ाइल सिस्टम का उपयोग करें।

सारांश

  • @AppStorage — UserDefaults में रिएक्टिव सेटिंग्स स्टोरेज के लिए property wrapper
  • ऑटो-सेव और किसी भी स्रोत से मान बदलने पर UI का ऑटो-अपडेट
  • समर्थन करता है String, Int, Double, Bool, Data, URL और RawRepresentable enums
  • डिफ़ॉल्ट मान घोषणा में सेट किया जाता है और पहले लॉन्च पर पुनर्स्थापित होता है
  • App Group ऐप और एक्सटेंशन के बीच @AppStorage सिंक करने की अनुमति देता है
  • UserDefaults केवल छोटी मात्रा के डेटा के लिए उपयुक्त है — 100 KB तक
  • @AppStorage का उपयोग उपयोगकर्ता सेटिंग्स के लिए करें, अस्थायी स्क्रीन स्थितियों के लिए @State

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें