تحويل String إلى Int في Swift: من البسيط إلى عالي الأداء
\n\nكل مطور iOS يواجه عاجلاً أم آجلاً مهمة بسيطة ظاهرياً: تحويل سلسلة نصية إلى رقم. قد يبدو الأمر سهلاً — Int("42") وينتهي الأمر. ولكن عندما يعالج التطبيق آلاف السلاسل النصية، أو يحلل سجلات JSON، أو يقرأ إدخال المستخدم، يصبح أداء هذه العملية بالغ الأهمية.
في هذه المقالة، لن نعرض فقط كيفية تحويل String إلى Int في Swift، بل سنقوم بتحقيق حقيقي: أي طريقة أسرع، وما المخاطر الخفية وراء الكود البسيط، وكيف تكتب كوداً محسّناً في Swift لا يخذلك في بيئة الإنتاج.
\n\nالمادة مبنية على سؤال شائع من Stack Overflow (آلاف المشاهدات) ومُكيَّفة لبوابة PythonLib التعليمية. لنبدأ!
\n\n1. الطريقة الأساسية: Int(string)
\n\nالطريقة الأكثر وضوحاً والتي توصي بها Apple هي استخدام المُهيئ Int(String). يُرجع قيمة اختيارية Int?، وهذا آمن: إذا لم تكن السلسلة النصية رقماً، ستحصل على nil.
let stringNumber = "123"\nif let number = Int(stringNumber) {\n print("الرقم: \\(number)")\n} else {\n print("فشل التحويل")\n}\n\nالمزايا:
\n- \n
- قابلية قراءة الكود — الأفضل بين جميع الخيارات. \n
- الأمان — القيمة الاختيارية تحمي من الأعطال. \n
- دعم أنظمة العد المختلفة:
Int("FF", radix: 16). \n
العيوب:
\n- \n
- الأداء — قد يكون عنق زجاجة في العمليات الجماعية. \n
- لا يعالج المسافات، رموز العملات، الأرقام المترجمة. \n
هذه الطريقة مثالية لـ 90% من الحالات. ولكن إذا كنت تكتب محللاً للسجلات أو تعالج ملفات CSV بملايين الأسطر — تابع القراءة.
\n\n2. استخدام NumberFormatter: للسلاسل النصية "غير النظيفة"
\n\nالعالم الحقيقي ليس مثالياً. قد يدخل المستخدم " 42 " أو "$100" أو "1 234.56". هنا يأتي دور NumberFormatter — أداة قوية ولكنها بطيئة.
let formatter = NumberFormatter()\nformatter.numberStyle = .decimal\n\nif let number = formatter.number(from: " 1 234 ")?.intValue {\n print(number) // 1234\n}\n\nمتى تستخدم:
\n- \n
- تحليل الأرقام المترجمة (التنسيق الأوروبي "1.234,56"). \n
- سلاسل نصية تحتوي على مسافات، عملات، نسب مئوية. \n
- حقول إدخال واجهة المستخدم حيث قد يدخل المستخدم أي شيء. \n
لكن تذكر: NumberFormatter ثقيل. إنشاءه مكلف، لذا قم دائماً بتخزين النسخة مؤقتاً كمتغير ثابت، ولا تنشئه من جديد لكل سلسلة نصية.
3. Scanner (NSScanner) — قديم ولكنه سريع
\n\nالنهج الكلاسيكي من Objective-C — Scanner. يعمل أسرع من NumberFormatter، لكنه يتطلب الدقة.
let scanner = Scanner(string: "123abc")\nvar intValue: Int = 0\nif scanner.scanInt(&intValue) {\n print("تم العثور على: \\(intValue)") // 123\n}\n\nيقوم Scanner بمسح السلسلة النصية من اليسار إلى اليمين ويتوقف عند أول حرف غير رقمي. هذا مفيد إذا كنت بحاجة إلى "استخراج" رقم من سلسلة نصية تحتوي على بيانات غير مرغوب فيها.
\n\nتلميح اختبار الأداء: Scanner أسرع من NumberFormatter بـ 3-5 مرات، ولكنه أبطأ من Int() البسيط بـ 2-3 مرات. مثالي لتحليل البيانات المختلطة.
4. دالة مخصصة: تحليل يدوي لأقصى سرعة
\n\nإذا كنت تقرأ هذه المقالة على PythonLib، فأنت تعلم بالتأكيد: عندما تحتاج السرعة — اكتب يدوياً. للسلاسل الرقمية النقية (فقط الأحرف 0-9، وربما علامة ناقص) يمكنك كتابة محلل خاص بك.
\n\nfunc fastInt(from string: String) -> Int? {\n var result = 0\n var isNegative = false\n var started