Swift: print() vs println() vs NSLog() — ماذا تختار ولماذا هذا مهم؟
\n\nكل من يبدأ في تعلم Swift، عاجلاً أم آجلاً، يواجه إخراج البيانات إلى وحدة التحكم. قد يبدو الأمر بسيطاً؟ ولكن هنا يظهر الارتباك: print()، println() و NSLog() — ما الفرق؟ لماذا نحتاج إلى ثلاث طرق إذا كان بإمكاننا الاكتفاء بواحدة؟ في هذه المقالة، سنقوم بترتيب الأمور، ونعرض الأمثلة، ونساعدك على عدم الخلط بين هذه الدوال أبداً.
يعتمد الموضوع على سؤال شائع حقيقي من Stack Overflow، حصد آلاف المشاهدات. قمنا بتكييفه ليكون محتوى تعليمياً، لتتمكن ليس فقط من الحفظ، بل من فهم منطق Swift.
\n\n\n\n
تاريخ موجز: من Objective-C إلى Swift الحديث
\n\nلفهم الفرق، نحتاج إلى الغوص قليلاً في التاريخ. Swift هي لغة حديثة (صدرت في عام 2014)، لكنها صُممت لتكون خليفة لـ Objective-C. لذلك، تتعايش فيها بسلام دوال Swift "الأصلية" والدوال القديمة القادمة من عالم Apple.
\n\n- \n
println()— بقايا من الإصدارات الأولى جداً من Swift (قبل الإصدار 2.0). اليوم تم حذفها بالكامل. \n print()— البديل الحديث لـprintln()، ظهر في Swift 2.0. \n NSLog()— دالة من عالم Objective-C، لا تزال تُستخدم بنشاط لتصحيح الأخطاء. \n
إذا كنت تكتب بلغة Swift الحديثة (الإصدار 4.x وما فوق)، فلن تصادف println() بعد الآن — فالمترجم سيعطي خطأ ببساطة. لكن في الدروس التعليمية القديمة والمنتديات، لا تزال تظهر، لذا من المهم فهم ما هي وماذا حل محلها.
\n\n
print() — الأداة الرئيسية للإخراج
\n\nكيف تعمل print()؟
\n\nبدءاً من Swift 2.0، أصبحت print() الطريقة القياسية لإخراج البيانات إلى وحدة التحكم. إنها مرنة، بسيطة، ويمكن التحكم بها بالكامل.
let name = "آنا"\nlet age = 25\n\nprint("مرحباً، \\(name)! عمرك \\(age) سنة.")\n// الإخراج: مرحباً، آنا! عمرك 25 سنة.\n\nالفرق الرئيسي عن println() القديمة هو أن print() لا تضيف حرف السطر الجديد تلقائياً. بالأحرى، تضيفه، لكن يمكنك التحكم في ذلك باستخدام المعامل terminator.
// إخراج عادي\nprint("السطر الأول")\nprint("السطر الثاني")\n// الإخراج:\n// السطر الأول\n// السطر الثاني\n\n// إخراج بدون الانتقال إلى سطر جديد\nprint("السطر الأول", terminator: "")\nprint("السطر الثاني", terminator: "")\n// الإخراج: السطر الأولالسطر الثاني\n\nمعاملات print()
\n\n- \n
items— ما تقوم بإخراجه (يمكن أن يكون عدة قيم مفصولة بفواصل). \n separator— الفاصل بين العناصر (افتراضياً مسافة). \n terminator— ما يوضع في نهاية السطر (افتراضياً\\n— سطر جديد). \n
print(1, 2, 3, separator: "-", terminator: "!")\n// الإخراج: 1-2-3!\n\nمتى تستخدم: للإخراج العادي للبيانات، وتسجيل الدخول في التطبيقات البسيطة، والأمثلة التعليمية.
\n\n\n\n
println() — ضيف من الماضي
\n\nإذا صادفت println() في أي كود قديم، فاعلم أنها مشابهة لـ print() من الإصدارات الأولى لـ Swift. الفرق الوحيد: println() كانت دائماً تضيف حرف السطر الجديد في النهاية، ولم يكن لديها معامل terminator.
// كود قديم في Swift 1.x\nlet x = 10\nprintln("قيمة x = \\(x)")\n// الإخراج: قيمة x = 10 (مع سطر جديد)\n\nفي الإصدارات الحديثة من Swift (بدءاً من 2.0)، لم تعد println() موجودة. إذا حاولت استخدامها، ستحصل على خطأ في الترجمة. فقط استبدلها بـ print() — وسيعمل كل شيء.