0Pricing
Swift Academy · Lektion

Wiederverwendbarkeit und Einschränkungen

Entwerfen Sie generische Wrapper mit type constraints (z. B. Value: Comparable ), fügen Sie mit where gezielte APIs hinzu und kombinieren Sie mehrere Wrapper.

Wiederverwendbarkeit und Einschränkungen ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.

Warum Constraints?

Schreiben Sie einen Wrapper und verwenden Sie ihn für viele Typen wieder, indem Sie ihn mit Constraints generisch machen. Fügen Sie mit where-Klauseln gezielte APIs hinzu und kombinieren Sie kleine Wrapper.

Generisch + Comparable

Verwenden Sie Comparable, damit ein einziges Bounded mit Int, String usw. funktioniert. Ungültige Typen werden bereits zur Compile-Zeit abgelehnt.

@propertyWrapper
struct Bounded<Value: Comparable> {
    private var value: Value
    private let range: ClosedRange<Value>

    var wrappedValue: Value {
        get { value }
        set {
            // clamp using Comparable
            if newValue < range.lowerBound { value = range.lowerBound }
            else if newValue > range.upperBound { value = range.upperBound }
            else { value = newValue }
        }
    }

    init(wrappedValue: Value, _ range: ClosedRange<Value>) {
        self.range = range
        self.value = min(max(wrappedValue, range.lowerBound), range.upperBound)
    }
}

struct Stats {
    @Bounded(0...100) var score: Int = 120
    @Bounded("a"..."z") var letter: String = "Swift"
}
var st = Stats()
print(st.score)   // 100
st.letter = "m"
print(st.letter)

Eingeschränkte Erweiterungen

Verwenden Sie where, um zusätzliche Funktionen nur dann anzubieten, wenn der Typ sie unterstützt (z. B. Integer-Flags oder Aktualisierungen von Gleitkommazahlen).

extension Bounded where Value: BinaryInteger {
    var isMaxed: Bool { wrappedValue == range.upperBound }
}
extension Bounded where Value: FloatingPoint {
    mutating func bump(by delta: Value) { wrappedValue = wrappedValue + delta }
}

struct Meter {
    @Bounded(0...10) var steps: Int = 9
    @Bounded(0.0...1.0) var progress: Double = 0.25
}
var m = Meter()
print(m.$steps)          // projectedValue not defined; accessing wrapper is not allowed directly here
print(m._steps)          // compiler creates backing storage name; shown for illustration only
print(m.steps)           // 9
print(m._progress)       // backing storage (illustrative)
m._progress.bump(by: 0.6)
print(m.progress)        // 0.85 (clamped if exceeded)

Wrapper nur für Collections

Beschränken Sie APIs auf Collections, indem Sie sie auf RangeReplaceableCollection einschränken. Das funktioniert mit String und Array.

@propertyWrapper
struct MaxLength<Value: RangeReplaceableCollection> where Value.Element: Sendable {
    private var storage: Value
    private let limit: Int

    var wrappedValue: Value {
        get { storage }
        set {
            var v = newValue
            if v.count > limit { v.removeLast(v.count - limit) }
            storage = v
        }
    }

    init(wrappedValue: Value, _ limit: Int) {
        self.limit = limit
        self.storage = wrappedValue
        if storage.count > limit { storage.removeLast(storage.count - limit) }
    }
}

struct Post {
    @MaxLength(10) var title: String = "hello swift learners"
    @MaxLength(5) var tags: [String] = ["swift","ios","spm"]
}
var p = Post()
print(p.title)  // "hello swif"
print(p.tags)   // ["swift","ios","spm"]

Zusammensetzen von Wrappern

Sie können kleine Wrapper stapeln. Hier wird zuerst Trimmed ausgeführt, anschließend stellt NonEmpty einen Fallback sicher.

@propertyWrapper
struct Trimmed {
    private var s: String = ""
    var wrappedValue: String {
        get { s }
        set { s = newValue.trimmingCharacters(in: .whitespacesAndNewlines) }
    }
    init(wrappedValue: String) { self.wrappedValue = wrappedValue }
}

@propertyWrapper
struct NonEmpty {
    private var s: String = ""
    var wrappedValue: String {
        get { s }
        set { s = newValue.isEmpty ? "N/A" : newValue }
    }
    init(wrappedValue: String) { self.wrappedValue = wrappedValue }
}

struct Profile {
    @NonEmpty @Trimmed var displayName: String = "  "
}
var prof = Profile()
print(prof.displayName)  // "N/A"

Lokale Variablen + Wiederverwendung

Wrapper funktionieren auch für lokale Variablen. Halten Sie sie generisch, damit Sie sie in verschiedenen Modulen wiederverwenden können.

@propertyWrapper
struct Default<Value> {
    private var value: Value
    private let make: () -> Value
    var wrappedValue: Value {
        get { value }
        set { value = newValue }
    }
    init(wrappedValue: Value, _ factory: @escaping () -> Value) {
        self.value = wrappedValue
        self.make = factory
    }
    mutating func reset() { value = make() }
}

// Local variable usage
do {
    @Default({ 0 }) var counter: Int = 5
    print(counter) // 5
    _counter.reset()
    print(counter) // 0
}

Compile-Zeit-Constraint für Wrapper

Kurztest: Wie schränken Sie einen Wrapper auf Comparable-Typen ein?

Zusammenfassung

Zusammenfassung: Machen Sie Wrapper generisch, fügen Sie Constraints hinzu, um die sichere Verwendung zu gewährleisten, stellen Sie mit where-Klauseln gezielte APIs bereit und kombinieren Sie kleine Wrapper für mehr Klarheit.

Häufig gestellte Fragen

Ist die Lektion „Wiederverwendbarkeit und Einschränkungen“ kostenlos?

Ja — der vollständige Text von „Wiederverwendbarkeit und Einschränkungen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.

Was lerne ich in „Wiederverwendbarkeit und Einschränkungen“?

Entwerfen Sie generische Wrapper mit type constraints (z. B. Value: Comparable ), fügen Sie mit where gezielte APIs hinzu und kombinieren Sie mehrere Wrapper. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 3.

Wie lange dauert die Lektion „Wiederverwendbarkeit und Einschränkungen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Wrapper und projectedValue erstellen
  2. Wiederverwendbarkeit und Einschränkungen
  3. Gängige Wrapper-Muster (Validierung, Caching)
← Zurück zu Swift Academy