إنشاء تسلسلات كسولة مخصصة
أنشئ تسلسلاتك الخاصة ذات التقييم الكسول.
إنشاء تسلسلات كسولة مخصصة درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
لماذا نستخدم التقييم الكسول المخصص؟
بالإضافة إلى map وfilter، يمكنكم إنشاء تسلسلاتكم الخاصة التي تُقيَّم بطريقة كسولة، لأغراض مثل المولدات اللانهائية أو تدفقات البيانات المحسوبة المكلفة التي ينبغي تشغيلها عند الطلب.
نوع LazySequence
يؤدي استدعاء .lazy إلى تغليف مجموعة في نوع يطبّق LazySequenceProtocol. وتعيد العمليات التي تضيفونها أغلفة كسولة إضافية:
let view = [1, 2, 3].lazy
let mapped = view.map { $0 * 2 }
print(Array(mapped)) // [2, 4, 6] -- LazyMapSequenceتسلسل قائم على السحب
تعمل التسلسلات المخصصة بأسلوب قائم على السحب: إذ يحسب كل استدعاء للمكرّر القيمة التالية فقط عند طلبها. إليكم مولّدًا لأعداد فيبوناتشي:
struct Fibonacci: Sequence, IteratorProtocol {
var a = 0, b = 1
mutating func next() -> Int? {
let r = a
(a, b) = (b, a + b)
return r
}
}
print(Array(Fibonacci().prefix(6))) // [0, 1, 1, 2, 3, 5]لانهائي ويُستهلك بطريقة كسولة
بما أن القيم تُسحب عند الطلب، يكون التسلسل اللانهائي آمنًا ما دمتم تأخذون جزءًا محدودًا منه:
struct Naturals: Sequence, IteratorProtocol {
var n = 1
mutating func next() -> Int? { defer { n += 1 }; return n }
}
print(Array(Naturals().prefix(4))) // [1, 2, 3, 4]تطبيق LazySequenceProtocol
يتيح اعتماد LazySequenceProtocol لنوعكم الخاص إنشاء سلاسل كسولة باستخدام map/filter أيضًا:
struct Counter: Sequence, IteratorProtocol, LazySequenceProtocol {
var n = 0; let limit: Int
mutating func next() -> Int? {
guard n < limit else { return nil }
defer { n += 1 }
return n
}
}
print(Array(Counter(n: 0, limit: 3).map { $0 * 10 })) // [0, 10, 20]sequence(first:next:)
توفر المكتبة القياسية أداة لإنشاء تسلسلات كسولة مخصصة دون الحاجة إلى نوع جديد:
let powers = sequence(first: 1) { $0 <= 16 ? $0 * 2 : nil }
print(Array(powers)) // [1, 2, 4, 8, 16, 32]sequence(state:next:)
يمكنكم تمرير حالة أكثر تعقيدًا بين الخطوات:
let fibs = sequence(state: (0, 1)) { (s: inout (Int, Int)) -> Int? in
let r = s.0
s = (s.1, s.0 + s.1)
return r
}
print(Array(fibs.prefix(6))) // [0, 1, 1, 2, 3, 5]غلاف AnySequence
أخفوا النوع الفعلي خلف AnySequence عند إتاحة واجهة برمجية:
func evens(upTo n: Int) -> AnySequence<Int> {
AnySequence((0...n).lazy.filter { $0 % 2 == 0 })
}
print(Array(evens(upTo: 8))) // [0, 2, 4, 6, 8]تدفق محسوب بطريقة كسولة
أجّلوا العمل المكلف حتى استهلاك كل عنصر فعليًا:
let stream = (1...5).lazy.map { (n: Int) -> Int in
print("computing \(n)")
return n * n
}
print(stream.first!) // computing 1, then 1إيقاف مولّد
أعيدوا nil من next() لإنهاء التسلسل بطريقة سليمة:
let countdown = sequence(state: 3) { (s: inout Int) -> Int? in
guard s > 0 else { return nil }
defer { s -= 1 }
return s
}
print(Array(countdown)) // [3, 2, 1]جمع الأجزاء معًا
اجمعوا بين مولّد مخصص وعوامل كسولة لإنشاء مسار يُنفّذ عند الطلب:
let primesIsh = sequence(first: 2) { $0 < 20 ? $0 + 1 : nil }
.lazy
.filter { n in (2..<n).allSatisfy { n % $0 != 0 } }
print(Array(primesIsh)) // [2, 3, 5, 7, 11, 13, 17, 19]تحقق سريع
ما الذي يشير إلى نهاية تسلسل مخصص يطبّق IteratorProtocol؟
مراجعة
لقد تعلمتم كيفية إنشاء تسلسلات كسولة مخصصة:
- ينتج
.lazyأغلفة تطبّقLazySequenceProtocol - طبّقوا
SequenceوIteratorProtocol؛ إذ يعيدnext()القيمةnilللتوقف - استخدموا
sequence(first:next:)وsequence(state:next:)كأداتين سريعتين للإنشاء - غلّفوا التسلسل في
AnySequenceلإخفاء الأنواع الفعلية
اكتملت الدورة! التالي: التعمق في الإغلاقات.
الأسئلة الشائعة
هل درس «إنشاء تسلسلات كسولة مخصصة» مجاني؟
نعم — نص درس «إنشاء تسلسلات كسولة مخصصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء تسلسلات كسولة مخصصة»؟
أنشئ تسلسلاتك الخاصة ذات التقييم الكسول. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «إنشاء تسلسلات كسولة مخصصة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الخاصية lazy
- map و filter الكسولان
- مفاضلات التنفيذ الكسول والفوري
- إنشاء تسلسلات كسولة مخصصة