أتمتة المهام في Swift: من الروتين إلى السحر بسطر واحد

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا Swift ليس فقط لتطوير التطبيقات

\n\n

عندما تسمع "Swift"، أول ما يتبادر إلى ذهنك هو تطوير iOS وXcode ولوحات القصص والقيود التي لا تنتهي. ولكن هناك جانب آخر لهذه اللغة لا يعرفه الكثيرون. Swift هي أداة قوية لـ أتمتة المهام على macOS. نحن لا نتحدث عن تجميع التطبيقات، بل عن الأمور اليومية البسيطة: إعادة تسمية مئات الملفات، تحليل تقرير CSV، إرسال إشعار في الساعة 6 مساءً، أو جمع السجلات من الخادم.

\n\n

لماذا Swift بدلاً من Python أو Bash؟ لأن Swift:

\n
    \n
  • يعمل بشكل أصلي مع macOS (الوصول إلى Foundation و Dispatch و UserNotifications);
  • \n
  • لا يتطلب بيئة افتراضية أو تبعيات (إذا لم تستخدم SPM);
  • \n
  • يعطي أخطاء ترجمة واضحة — لن تضيع ساعة في البحث عن مسافة زائدة كما في Bash;
  • \n
  • يمكن تشغيله كسكريبت بسطر واحد: swift myScript.swift.
  • \n
\n\n

في هذه المقالة، سأعرض لكم عدة سيناريوهات حقيقية للأتمتة باستخدام Swift. يمكنكم نسخ الكود وتشغيله على أجهزتكم، والأهم من ذلك، فهم كيفية كتابة أدواتكم الخاصة. هيا بنا!

\n\n

كيف يعمل سكريبت Swift: الحد الأدنى من النظرية

\n\n

لكتابة أتمتة في Swift، لست بحاجة إلى Xcode. يكفي الطرفية وأي محرر نصوص. أنشئ ملفًا باسم script.swift وقم بتشغيله بالأمر:

\n\n
swift script.swift
\n\n

سيقوم Swift بتجميع وتنفيذ الكود تلقائيًا. إذا كان السكريبت كبيرًا وتريد تسريع عمليات التشغيل المتكررة، يمكنك تجميعه مسبقًا: swiftc -O script.swift -o script وتشغيل الملف الثنائي مباشرة.

\n\n

كل ما سنكتبه لاحقًا يعمل فورًا — بدون أي مكتبات خارجية. فقط Foundation الذي يتم تحميله تلقائيًا.

\n\n

السيناريو الأول: إعادة تسمية الملفات بشكل مجمّع

\n\n

تخيل: لديك مجلد به صور IMG_001.jpg و IMG_002.jpg ... و IMG_100.jpg. تريد إعادة تسميتها إلى Vacation_1.jpg و Vacation_2.jpg وهكذا. يدويًا — 100 عملية. بسكريبت — 0.5 ثانية.

\n\n
import Foundation\n\nlet fileManager = FileManager.default\nlet currentPath = fileManager.currentDirectoryPath\n\nguard let files = try? fileManager.contentsOfDirectory(atPath: currentPath) else {\n    print("فشل في قراءة المجلد")\n    exit(1)\n}\n\nlet imageFiles = files.filter { $0.hasSuffix(".jpg") || $0.hasSuffix(".png") }\n\nfor (index, file) in imageFiles.enumerated() {\n    let newName = "Vacation_\\(index + 1)." + (file.hasSuffix(".jpg") ? "jpg" : "png")\n    let oldURL = URL(fileURLWithPath: currentPath).appendingPathComponent(file)\n    let newURL = URL(fileURLWithPath: currentPath).appendingPathComponent(newName)\n    \n    do {\n        try fileManager.moveItem(at: oldURL, to: newURL)\n        print("✅ \\(file) ← \\(newName)")\n    } catch {\n        print("❌ خطأ مع الملف \\(file): \\(error.localizedDescription)")\n    }\n}
\n\n

كيف يعمل هذا:

\n
    \n
  • FileManager.default — الوصول إلى نظام الملفات;
  • \n
  • contentsOfDirectory — الحصول على قائمة الملفات في المجلد الحالي;
  • \n
  • تصفية الصور فقط;
  • \n
  • إعادة التسمية عبر moveItem (نعم، في Swift إعادة التسمية هي نقل).
  • \n
\n\n

يمكنك بسهولة تعديل السكريبت: تغيير البادئة، الامتدادات، إضافة التاريخ إلى الاسم. هذا بالفعل سكريبت Swift مفيد يوفر الوقت كل يوم.

\n\n

ميزة إضافية: إضافة التاريخ

\n\n
let dateFormatter = DateFormatter()\ndateFormatter.dateFormat = "yyyy-MM-dd"\nlet dateString = dateFormatter.string(from: Date())\n\nfor (index, file) in imageFiles.enumerated() {\n    let newName = "\\(dateString)_\\(index + 1).jpg"\n    // ... الباقي كما في المثال أعلاه\n}
\n\n

السيناريو الثاني: تحليل ملف CSV

المدونات

توصيات الكتب