إنشاء الأغلفة و 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء الأغلفة و projectedValue
- قابلية إعادة الاستخدام والقيود
- أنماط الأغلفة الشائعة (التحقق والتخزين المؤقت)