هل Swift مناسبة لهياكل البيانات والخوارزميات؟
نعم. الأنواع العامة (generics)، والبروتوكولات مثل Comparable وHashable، والقيم الاختيارية (optionals) تجعل العقدة التي قد يكون next فيها nil صريحة في نوعها، ويتحقق المصرّف من كل استخدام. وهناك أمران يستحقان المعرفة مبكراً: المكتبة القياسية محدودة، لذا تكتب طابورك وكومتك بنفسك؛ والمجموعات قيم، لذا فإسناد مصفوفة إلى متغير جديد ثم تغييرها يترك الأصل كما هو، وهذا يفاجئ القادمين من Java أو JavaScript.
أي أنواع Swift تقابل أي هياكل بيانات؟
Array مصفوفة ديناميكية ومكدس، مع append وpopLast()؛ وDictionary وSet جداول تجزئة. وهذه هي المكتبة القياسية كلها. تضيف حزمة swift-collections مفتوحة المصدر من Apple كلاً من Deque وHeap وOrderedSet وOrderedDictionary؛ أما القائمة المترابطة والشجرة وشجرة البادئات والرسم البياني فتكتبها بنفسك، في الخطوتين الأولى والثانية.
لماذا يجب أن تكون عقدة الشجرة في Swift صنفاً؟
لأن الـ struct قيمة. لا يمكنه أن يحمل خاصية مخزّنة من نوعه هو، ولو كانت اختيارية، وحيثما تُحفَظ منه نسخ، كما في مصفوفة، فتغيير نسخة يترك الأصل كما هو. أما كائن الصنف فمرجع، لذا تستطيع العقد أن تشير إحداها إلى الأخرى؛ ويصلح indirect enum أيضاً، للأشجار التي لا تغيّرها في مكانها أبداً. والعقبة هي ARC: يجب أن يكون المؤشر إلى الأب weak، وإلا أبقى الأب والابن كلٌّ منهما الآخر حياً، ولن تُحرَّر الشجرة أبداً.
كيف أكتب طابوراً سريعاً في Swift؟
ليس بـ removeFirst(): فهي على Array تزيح كل العناصر المتبقية، لذا تكون كل عملية إخراج O(n). احتفظ بفهرس للرأس وقدّمه، أو استخدم مصفوفتين: أضف إلى مصفوفة الإدخال، وأخرج من مصفوفة الإخراج، وأعد ملء مصفوفة الإخراج بعكس مصفوفة الإدخال حين تفرغ. كلا الأسلوبين يجعل الإخراج O(1) بتكلفة مُطفأة (amortized). وDeque في swift-collections تفعل ذلك نيابة عنك، وفي الخطوة الأولى تبني طابوراً بنفسك.
ما الدورات في هذا المسار التي لا تُدرَّس بلغة Swift؟
ثلاث دورات. البرمجة الديناميكية وسلسلة مقابلات Python تُدرَّسان بلغة Python، وعمليات البتات بلغة C++. وتجدها مُدرجة بعد الخطوات، ولكل منها رابط يفتحها بلغتها. جدول النتائج المحفوظة في Swift مصفوفة أو Dictionary، والأعداد الصحيحة في Swift تحمل الخاصيتين nonzeroBitCount وtrailingZeroBitCount، اللتين تؤديان بخاصية واحدة ما تؤديه حيلة بتات في C++ يدوياً.
هل أحتاج إلى معرفة Swift قبل بدء هذا المسار؟
البُنى (structs) والأصناف والقيم الاختيارية والأنواع العامة والبروتوكولات على الأقل. إن كانت هذه جديدة عليك، فدورة Swift من Coddy تغطيها أولاً مجاناً، ويبدأ هذا المسار من حيث تنتهي.