0Pricing
Swift Academy · درس

إنشاء الأغلفة و projectedValue

أنشئ غلافًا مخصصًا، واضبط wrappedValue ، وأظهر البيانات الوصفية والمساعدات باستخدام projectedValue ( $ ).

إنشاء الأغلفة و projectedValue درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.

لماذا أغلفة الخصائص؟

غلاف الخاصية هو نوع قابل لإعادة الاستخدام يدير كيفية تخزين الخاصية وقراءتها:

  • wrappedValue: القيمة العامة
  • projectedValue: واجهة API إضافية عبر $
  • التهيئة عبر المُهيئات أو المعاملات

Clamped + علامة القيمة المُسقطة

يقيّد @Clamped رقمًا ضمن نطاق. وتُبيّن القيمة المُسقطة ($hp) ما إذا كانت آخر عملية تعيين قد قيّدت القيمة.

@propertyWrapper
struct Clamped {
    private var value: Int
    private let range: ClosedRange<Int>
    private(set) var wasClampedLastSet = false

    var wrappedValue: Int {
        get { value }
        set {
            let clamped = min(max(newValue, range.lowerBound), range.upperBound)
            wasClampedLastSet = (clamped != newValue)
            value = clamped
        }
    }

    var projectedValue: Bool { wasClampedLastSet } // $prop -> was it clamped?

    init(wrappedValue: Int, range: ClosedRange<Int>) {
        self.range = range
        let clamped = min(max(wrappedValue, range.lowerBound), range.upperBound)
        self.value = clamped
        self.wasClampedLastSet = (clamped != wrappedValue)
    }
}

struct Player {
    @Clamped(range: 0...100) var hp: Int = 120  // init clamps to 100
}

var p = Player()
print(p.hp)     // 100
p.hp = -5
print(p.hp, p.$hp)  // 0 true (was clamped)

التطبيع والعرض البديل

يمكن للأغلفة تحويل الإدخال (trim/lowercase). ويمكن لـ $property كشف صيغة بديلة مفيدة.

@propertyWrapper
struct Normalized {
    private var storage: String = ""
    var wrappedValue: String {
        get { storage }
        set { storage = newValue.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() }
    }
    var projectedValue: String { storage.uppercased() } // alternate view

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

struct User {
    @Normalized var username: String = "  Alice  "
}
let u = User()
print(u.username)   // "alice"
print(u.$username)  // "ALICE" (projected)

غلاف قابل للتهيئة

مرّر المعاملات إلى الأغلفة (مثل length). ويطبّق الغلاف التنسيق كلما عيّنت الخاصية.

@propertyWrapper
struct Padded {
    private var value: String
    private let length: Int
    var wrappedValue: String {
        get { value }
        set {
            let s = newValue
            value = s.count >= length ? String(s.prefix(length))
                                      : s + String(repeating: " ", count: length - s.count)
        }
    }
    var projectedValue: Int { value.count } // current width
    init(wrappedValue: String, length: Int) {
        self.length = length
        self.value = ""
        self.wrappedValue = wrappedValue
    }
}

struct Row {
    @Padded(length: 6) var code: String = "AB"
}
var r = Row()
print("|\(r.code)|")   // |AB    |
print(r.$code)        // 6

السجل عبر $value

استخدم projectedValue لكشف البيانات الوصفية، مثل سجل التغييرات، دون إثقال واجهة API للقيمة الأساسية.

@propertyWrapper
struct History<Value> {
    private var value: Value
    private(set) var changes: [Value] = []
    var wrappedValue: Value {
        get { value }
        set { changes.append(value); value = newValue }
    }
    var projectedValue: [Value] { changes } // $prop -> previous values
    init(wrappedValue: Value) { self.value = wrappedValue }
}

struct Settings {
    @History var level: Int = 1
}
var s = Settings()
s.level = 2
s.level = 3
print(s.level)    // 3
print(s.$level)   // [1, 2]

إرشادات التصميم

نصائح:

  • أبقِ الأغلفة صغيرة ومركّزة.
  • وثّق ما تكشفه $projectedValue.
  • فضّل التحويلات الخالصة، وتجنّب الآثار الجانبية الكبيرة.
  • وفّر مُهيئات واضحة وقيمًا افتراضية منطقية.

غرض القيمة المُسقطة

تحقّق سريعًا: ما استخدام $property في الأغلفة؟

خلاصة

خلاصة: نفّذ @propertyWrapper باستخدام wrappedValue؛ واعرض المساعدات والعلامات والسجل عبر projectedValue ($)، واضبط السلوك عبر المُهيئات.

الأسئلة الشائعة

هل درس «إنشاء الأغلفة و projectedValue» مجاني؟

نعم — نص درس «إنشاء الأغلفة و projectedValue» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.

ماذا ستتعلم في «إنشاء الأغلفة و projectedValue»؟

أنشئ غلافًا مخصصًا، واضبط wrappedValue ، وأظهر البيانات الوصفية والمساعدات باستخدام projectedValue ( $ ). تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.

كم من الوقت يستغرق درس «إنشاء الأغلفة و projectedValue»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء الأغلفة و projectedValue
  2. قابلية إعادة الاستخدام والقيود
  3. أنماط الأغلفة الشائعة (التحقق والتخزين المؤقت)
← العودة إلى Swift Academy