Swift Academy · पाठ

सामान्य रैपर पैटर्न (सत्यापन, कैशिंग)

सामान्य सत्यापन और कैशिंग रैपर बनाइए: इनपुट की जाँच कीजिए, डिफ़ॉल्ट मान दीजिए, महँगे कार्य का परिणाम याद रखिए और projected values के माध्यम से सहायक फ़्लैग उपलब्ध कराइए।

पाठ 3, कुल 3 में से8 चरण

सामान्य रैपर पैटर्न (सत्यापन, कैशिंग), CoddyKit पर Swift Academy का एक निःशुल्क पाठ है। यह 3 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Swift Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Swift Academy पाठ्यक्रम में कुल 3 पाठ शामिल हैं।

हम क्या बनाएँगे

इस पाठ में दो व्यावहारिक प्रतिरूप दिखाए गए हैं:

  • सत्यापन: डिफ़ॉल्ट और संदेशों के साथ इनपुट स्वीकार करें या ठीक करें।
  • कैशिंग: परिणाम संग्रहीत करें और $helpers जैसे clear() तथा isCached उपलब्ध कराएँ।

सत्यापन: NonEmpty

@NonEmpty खाली इनपुट को रोकता है और एक डिफ़ॉल्ट मान देता है। projectedValue बताता है कि पिछली बार सेट किए गए मान को अपने-आप ठीक किया गया था या नहीं।

@propertyWrapper
struct NonEmpty {
    private var value: String = ""
    private(set) var lastFixed: Bool = false

    var wrappedValue: String {
        get { value }
        set {
            if newValue.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
                value = "N/A"          // default fallback
                lastFixed = true
            } else {
                value = newValue
                lastFixed = false
            }
        }
    }

    var projectedValue: Bool { lastFixed } // $name -> was fixed?

    init(wrappedValue: String) { self.wrappedValue = wrappedValue }
}

struct Profile {
    @NonEmpty var displayName: String = "  "
}
var p = Profile()
print(p.displayName)  // "N/A"
print(p.$displayName) // true (was fixed)

सत्यापन: नियम-आधारित

@Validated जेनेरिक है और नियम क्लोज़र तथा एक फ़ॉलबैक स्वीकार करता है। इसका उपयोग लंबाई, सीमा या कस्टम जाँचों के लिए करें।

@propertyWrapper
struct Validated<Value> {
    private var value: Value
    private let rule: (Value) -> Bool
    private let fallback: Value
    private(set) var lastValid: Bool = true

    var wrappedValue: Value {
        get { value }
        set {
            if rule(newValue) {
                value = newValue
                lastValid = true
            } else {
                value = fallback
                lastValid = false
            }
        }
    }

    var projectedValue: Bool { lastValid } // $prop -> is valid?

    init(wrappedValue: Value, rule: @escaping (Value) -> Bool, fallback: Value) {
        self.rule = rule
        self.fallback = fallback
        self.value = wrappedValue
        self.lastValid = rule(wrappedValue)
        if !lastValid { self.value = fallback }
    }
}

struct Form {
    @Validated(rule: { $0.count >= 3 }, fallback: "???")
    var nickname: String = "hi"
}
var f = Form()
print(f.nickname)   // "???" (invalid -> fallback)
print(f.$nickname)  // false

कैशिंग: लेज़ी मेमोइज़ेशन

@LazyCached किसी क्लोज़र से प्राप्त मान को मेमोइज़ करता है। $result isCached और clear() सहायक उपलब्ध कराता है।

@propertyWrapper
struct LazyCached<Value> {
    private var storage: Value?
    private let build: () -> Value

    var wrappedValue: Value {
        mutating get {
            if let v = storage { return v }         // hit
            let v = build()                         // miss -> compute
            storage = v
            return v
        }
        // Optional: allow manual set to override cache
        set { storage = newValue }
    }

    struct Controls {
        private let getter: () -> Bool
        private let clearer: () -> Void
        var isCached: Bool { getter() }
        func clear() { clearer() }
    }

    var projectedValue: Controls {
        Controls(
            getter: { self.storage != nil },
            clearer: { self.storage = nil }
        )
    }

    init(_ build: @escaping () -> Value) {
        self.build = build
        self.storage = nil
    }
}

// Demo: expensive computation (simulated)
var calls = 0
func heavy() -> Int { calls += 1; return (1...10_000).reduce(0, +) }

struct Engine {
    @LazyCached(heavy) var result: Int
}
var e = Engine()
print(e.$result.isCached) // false
print(e.result)           // computes once
print(e.result)           // uses cache
print(calls)              // 1

कैशिंग: TTL-आधारित

@TimedCache TTL पूरा होने के बाद मान को ताज़ा करता है। प्रक्षेपित मान age उपलब्ध करा सकता है, ताकि कॉल करने वाली जगह यह तय कर सके कि कब ताज़ा करना है।

@propertyWrapper
struct TimedCache<Value> {
    private var storage: Value?
    private var timestamp: Date?
    private let ttl: TimeInterval
    private let build: () -> Value

    var wrappedValue: Value {
        mutating get {
            let now = Date()
            if let t = timestamp, let v = storage, now.timeIntervalSince(t) < ttl {
                return v                              // fresh
            }
            let v = build()                           // refresh
            storage = v
            timestamp = now
            return v
        }
    }

    struct Status { let age: TimeInterval? }
    var projectedValue: Status {
        let age = timestamp.map { Date().timeIntervalSince($0) }
        return Status(age: age)
    }

    init(ttl: TimeInterval, _ build: @escaping () -> Value) {
        self.ttl = ttl
        self.build = build
    }
}

// Demo (age only; TTL behavior depends on real time)
struct Stats {
    @TimedCache(ttl: 60) { Int.random(in: 0...1000) } var score: Int
}
var s2 = Stats()
print(s2.score)         // computes
print(s2.$score.age ?? -1)

डिज़ाइन दिशानिर्देश

डिज़ाइन सुझाव:

  • सत्यापन को शुद्ध और पूर्वानुमेय रखें; सुधारों की सूचना $flags से दें।
  • कैशिंग के लिए स्थिति को छोटा रखें; clear() या isCached उपलब्ध कराएँ।
  • नीतियों, जैसे फ़ॉलबैक और TTL, के लिए आरंभिक तर्क को प्राथमिकता दें।

कैशिंग के लिए प्रक्षेपित सहायक

त्वरित जाँच: कैशिंग रैपर में $value को क्या उपलब्ध कराना चाहिए?

पुनरावलोकन

पुनरावलोकन: इनपुट को सत्यापित करने के लिए रैपरों का उपयोग करें, जिसमें डिफ़ॉल्ट और नियम शामिल हैं, और महँगे परिणामों को कैश करने के लिए भी, चाहे वह लेज़ी हो या TTL-आधारित। साफ़-सुथरी कॉल करने वाली जगहों के लिए नियंत्रण और स्थिति को projectedValue में रखें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Swift सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
122
पाठ
409

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

क्या “सामान्य रैपर पैटर्न (सत्यापन, कैशिंग)” पाठ निःशुल्क है?

हाँ — Swift Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “सामान्य रैपर पैटर्न (सत्यापन, कैशिंग)” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Swift Academy पाठ्यक्रम में कुल 3 पाठ शामिल हैं।

“सामान्य रैपर पैटर्न (सत्यापन, कैशिंग)” में मैं क्या सीखूँगा?

सामान्य सत्यापन और कैशिंग रैपर बनाइए: इनपुट की जाँच कीजिए, डिफ़ॉल्ट मान दीजिए, महँगे कार्य का परिणाम याद रखिए और projected values के माध्यम से सहायक फ़्लैग उपलब्ध कराइए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Swift Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Swift Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Swift Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 3 में से 3वाँ पाठ है।

“सामान्य रैपर पैटर्न (सत्यापन, कैशिंग)” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Swift Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Swift Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. रैपर बनाना, projectedValue
  2. पुनः उपयोग और प्रतिबंध
  3. सामान्य रैपर पैटर्न (सत्यापन, कैशिंग)
← Swift Academy पर वापस जाएँ