إطار عمل CLI لـ Swift (iOS/macOS): ArgumentParser
في عالم التطوير لنظام Apple البيئي، غالبًا ما تنشأ الحاجة لإنشاء ليس فقط تطبيقات رسومية، بل أيضًا أدوات سطر أوامر قوية. سواء كان ذلك لأتمتة البناء، معالجة البيانات، أو إنشاء أدوات مساعدة لـ iOS/macOS — لا يمكن الاستغناء عن CLI (واجهة سطر الأوامر) عالي الجودة. لهذه الأغراض، تقدم Apple إطار العمل الرسمي ArgumentParser، المضمن في Swift Package Manager. إنها أداة حديثة، آمنة من حيث الأنواع، وتصريحية، تتيح لك إنشاء تطبيقات سطر أوامر بلغة Swift بأقل جهد.
على عكس التحليل البسيط للوسائط عبر CommandLine.arguments، يوفر ArgumentParser نهجًا منظمًا: تصف الأوامر، العلامات، والخيارات كخصائص لهياكلك، ويقوم الإطار تلقائيًا بإنشاء التعليمات، معالجة الأخطاء، والتحقق من صحة الإدخال. دعنا نتعرف على كيفية استخدام هذا الإطار لـ macOS و iOS (عبر Swift Package Manager).
التثبيت والإضافة
لا يتطلب ArgumentParser تثبيتًا منفصلًا — فهو متاح ضمن المكتبة القياسية لـ Swift (بدءًا من Swift 5.5). لاستخدامه في مشروعك، أضف التبعية في ملف Package.swift:
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyCLI", dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser", from: "1.2.0") ], targets: [ .executableTarget( name: "MyCLI", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser") ] ) ])بالنسبة لمشاريع iOS، يمكن إضافة الإطار عبر Swift Package Manager في Xcode، مع تحديد نفس المستودع. ومع ذلك، تجدر الإشارة إلى أن تطبيقات CLI تُنشأ عادةً لـ macOS، ولكن يمكن استخدام المكتبة أيضًا في تطبيقات iOS للتحليل الداخلي للنصوص.
المفاهيم الأساسية
يُبنى ArgumentParser حول ثلاث كيانات رئيسية:
- الأوامر (
ParsableCommand) — العنصر الأساسي، يمثل أمرًا واحدًا في CLI. كل أمر هو هيكل يطبق بروتوكولParsableCommand. - الوسائط (
@Argument) — معاملات موضعية، إلزامية الإدخال. - الخيارات (
@Option) — معاملات مسماة بعلامات طويلة (--name) وقصيرة (-n). - العلامات (
@Flag) — مفاتيح تشغيل منطقية (--verbose, --quiet).
مثال: إنشاء آلة حاسبة بسيطة عبر CLI
لننشئ تطبيق سطر أوامر لـ macOS يقوم بإجراء العمليات الحسابية الأساسية:
import ArgumentParser
struct Calculator: ParsableCommand { static let configuration = CommandConfiguration( commandName: "calc", abstract: "آلة حاسبة بسيطة لسطر الأوامر", discussion: "تدعم الجمع، الطرح، الضرب، والقسمة." )
@Argument(help: "الرقم الأول") var firstNumber: Double
@Argument(help: "الرقم الثاني") var secondNumber: Double
@Option(name: [.short, .long], help: "العملية: add, sub, mul, div") var operation: String = "add"
@Flag(name: [.short, .long], help: "إخراج مفصل") var verbose: Bool = false
mutating func run() throws { let result: Double switch operation { case "add": result = firstNumber + secondNumber case "sub": result = firstNumber - secondNumber case "mul": result = firstNumber * secondNumber case "div": guard secondNumber != 0 else { throw ValidationError("القسمة على صفر!") } result = firstNumber / s