الخاصية lazy
أجّل تنفيذ التحويلات حتى الحاجة إليها.
الخاصية lazy درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
التنفيذ الفوري افتراضيًا
تعمل أساليب المجموعات القياسية بشكل فوري: إذ تُنفّذ map وfilter وغيرهما على الفور، وتنشئ مصفوفة جديدة كاملة مباشرة، حتى إذا كنتم ستقرؤون العنصر الأول فقط.
يحدث العمل الفوري الآن
ينشئ هذا الكود المصفوفة المحوّلة بأكملها مقدمًا:
let nums = [1, 2, 3, 4, 5]
let doubled = nums.map { $0 * 2 } // whole array built now
print(doubled.first!) // 2خاصية lazy
توفّر كل مجموعة عرضًا باسم .lazy. وتكون العمليات على العرض الكسول مؤجلة؛ فلا تُنفّذ حتى تكرّروا على العناصر فعليًا أو تطلبوا عنصرًا محددًا.
إنشاء عرض كسول
ما عليكم سوى بدء التسلسل بالبادئة .lazy:
let nums = [1, 2, 3, 4, 5]
let view = nums.lazy.map { $0 * 2 }
// nothing computed yet
print(Array(view)) // [2, 4, 6, 8, 10]إثبات التنفيذ المؤجل
تُظهر الآثار الجانبية أن الإغلاق لا يُنفّذ إلا عند الطلب:
let nums = [1, 2, 3]
let lazyMapped = nums.lazy.map { n -> Int in
print("transforming \(n)")
return n * 2
}
print("created view")
print(lazyMapped.first!) // prints "transforming 1" then 2يُرجع lazy نوعًا مختلفًا
التسلسل الكسول غلاف خفيف الوزن، وليس Array:
let nums = [1, 2, 3]
let view = nums.lazy.map { $0 + 1 }
print(type(of: view).self != [Int].self) // true -- it is a LazyMapSequenceتحويل العرض الكسول إلى قيمة فعلية
حوّلوا العرض مرة أخرى إلى مصفوفة ملموسة باستخدام Array(...) عندما تحتاجون إلى تخزينه أو إرجاعه:
let nums = [1, 2, 3]
let result: [Int] = Array(nums.lazy.map { $0 * 10 })
print(result) // [10, 20, 30]استخدام lazy مع first(where:)
تظهر فائدة الكسل عند التوقف مبكرًا. إذ لا تتم معالجة سوى عدد كافٍ من العناصر للعثور على تطابق:
let nums = [1, 2, 3, 4, 5, 6]
let firstBig = nums.lazy.map { $0 * $0 }.first { $0 > 10 }
print(firstBig!) // 16 (stops at 4*4)استخدام lazy مع نطاق
تعمل النطاقات مع lazy أيضًا، وهو أمر مفيد للتسلسلات الكبيرة أو التي تبدو لانهائية:
let firstThree = (1...1000).lazy.map { $0 * $0 }.prefix(3)
print(Array(firstThree)) // [1, 4, 9]متى يُعاد تقييم العرض
يعيد العرض الكسول الحساب في كل مرة تكرّرون عليه — فهو لا يخزن النتائج. إذا كررتم عليه مرتين، فسيُنفّذ التحويل مرتين:
var calls = 0
let view = [1, 2].lazy.map { (n: Int) -> Int in calls += 1; return n }
_ = Array(view)
_ = Array(view)
print(calls) // 4متى نستخدم lazy
أضيفوا .lazy عندما يكون لديكم تسلسل طويل ولا تستهلكون سوى جزء من النتيجة — مثل أول تطابق أو بادئة أو عملية reduce واحدة. أما مع المصفوفات الصغيرة التي تُستهلك بالكامل، فالتنفيذ الفوري أبسط.
let nums = Array(1...100)
let result = nums.lazy.filter { $0 % 7 == 0 }.first
print(result!) // 7اختبار سريع
ما الذي تغيّره الخاصية .lazy في map وfilter؟
مراجعة
لقد تعلمتم أساسيات الكسل:
- تعمل أساليب المجموعات القياسية بشكل فوري — إذ تنشئ المصفوفات مباشرة
- تُرجع
.lazyعرضًا مؤجلًا، وهو نوع خاص من التسلسلات - لا يحدث العمل إلا عند التكرار على العناصر أو طلب عنصر
- حوّلوا العرض إلى قيمة فعلية باستخدام
Array(...)؛ وتعيد العروض تنفيذها في كل تكرار
التالي: سلاسل map وfilter الكسولة.
تعلم Swift مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 122
- الدروس
- 409
الأسئلة الشائعة
هل درس «الخاصية lazy» مجاني؟
نعم — نص درس «الخاصية lazy» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «الخاصية lazy»؟
أجّل تنفيذ التحويلات حتى الحاجة إليها. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الخاصية lazy»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.