0Pricing
Swift Academy · Ders

Yaygın sarmalayıcı kalıpları (doğrulama, önbellekleme)

Yaygın doğrulama ve önbellekleme sarmalayıcıları oluşturun: girdiyi denetleyin, varsayılanlar sağlayın, maliyetli işlemleri anımsayın ve yardımcı göstergeleri yansıtılan değerler aracılığıyla sunun.

Yaygın sarmalayıcı kalıpları (doğrulama, önbellekleme), CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 3 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 3 dersten oluşur.

Neler oluşturacağız

Bu derste iki pratik kalıp gösterilmektedir:

  • Doğrulama: Varsayılan değerler ve iletilerle girdileri kabul edin veya düzeltin.
  • Önbelleğe alma: Sonuçları saklayın, $helpers gibi clear() ve isCached yardımcılarını sunun.

Doğrulama: NonEmpty

@NonEmpty boş girdiyi engeller ve bir varsayılan değer sağlar. projectedValue, son atamanın otomatik olarak düzeltilip düzeltilmediğini bildirir.

@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)

Doğrulama: kurala dayalı

@Validated jeneriktir ve bir kural kapanışı ile bir geri dönüş değeri kabul eder. Bunu uzunluk, aralık veya özel denetimler için kullanın.

@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

Önbelleğe alma: gecikmeli anımsama

@LazyCached, bir kapanıştan elde edilen değeri gecikmeli olarak önbelleğe alır. $result, isCached ve clear() yardımcılarını sunar.

@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

Önbelleğe alma: TTL tabanlı

@TimedCache, bir TTL geçtikten sonra yenilenir. Yansıtılan değer, çağrı noktalarının ne zaman yenileme yapacağına karar verebilmesi için age bilgisini sunabilir.

@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)

Tasarım yönergeleri

Tasarım ipuçları:

  • Doğrulamayı saf ve öngörülebilir tutun; düzeltmeleri $flags ile bildirin.
  • Önbelleğe alma için durumu küçük tutun; clear() veya isCached sağlayın.
  • Politikalar için init bağımsız değişkenlerini (geri dönüş değerleri, TTL) tercih edin.

Önbelleğe alma için yansıtılan yardımcılar

Hızlı kontrol: Önbelleğe alma sarmalayıcısında $value ne sunmalıdır?

Özet

Özet: Girdileri doğrulamak (varsayılan değerler, kurallar) ve maliyetli sonuçları önbelleğe almak (gecikmeli, TTL) için sarmalayıcıları kullanın. Denetimi ve durumu, çağrı noktalarını temiz tutmak için projectedValue içine koyun.

Sıkça Sorulan Sorular

“Yaygın sarmalayıcı kalıpları (doğrulama, önbellekleme)” dersi ücretsiz mi?

Evet — “Yaygın sarmalayıcı kalıpları (doğrulama, önbellekleme)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 3 dersten oluşur.

“Yaygın sarmalayıcı kalıpları (doğrulama, önbellekleme)” dersinde ne öğreneceğim?

Yaygın doğrulama ve önbellekleme sarmalayıcıları oluşturun: girdiyi denetleyin, varsayılanlar sağlayın, maliyetli işlemleri anımsayın ve yardımcı göstergeleri yansıtılan değerler aracılığıyla sunun. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 3. dersidir.

“Yaygın sarmalayıcı kalıpları (doğrulama, önbellekleme)” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Sarmalayıcılar ve projectedValue oluşturma
  2. Yeniden kullanılabilirlik ve kısıtlamalar
  3. Yaygın sarmalayıcı kalıpları (doğrulama, önbellekleme)
← Swift Academy Sayfasına Dön