تحويل String إلى Int في Swift: 5 طرق مع اختبارات الأداء والتحسين

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

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

ابدأ الدورة

تحويل String إلى Int في Swift: من البسيط إلى عالي الأداء

\n\n

كل مطور iOS يواجه عاجلاً أم آجلاً مهمة بسيطة ظاهرياً: تحويل سلسلة نصية إلى رقم. قد يبدو الأمر سهلاً — Int("42") وينتهي الأمر. ولكن عندما يعالج التطبيق آلاف السلاسل النصية، أو يحلل سجلات JSON، أو يقرأ إدخال المستخدم، يصبح أداء هذه العملية بالغ الأهمية.

\n\n

في هذه المقالة، لن نعرض فقط كيفية تحويل String إلى Int في Swift، بل سنقوم بتحقيق حقيقي: أي طريقة أسرع، وما المخاطر الخفية وراء الكود البسيط، وكيف تكتب كوداً محسّناً في Swift لا يخذلك في بيئة الإنتاج.

\n\n

المادة مبنية على سؤال شائع من Stack Overflow (آلاف المشاهدات) ومُكيَّفة لبوابة PythonLib التعليمية. لنبدأ!

\n\n

1. الطريقة الأساسية: Int(string)

\n\n

الطريقة الأكثر وضوحاً والتي توصي بها Apple هي استخدام المُهيئ Int(String). يُرجع قيمة اختيارية Int?، وهذا آمن: إذا لم تكن السلسلة النصية رقماً، ستحصل على nil.

\n\n
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
  • الأداء — قد يكون عنق زجاجة في العمليات الجماعية.
  • \n
  • لا يعالج المسافات، رموز العملات، الأرقام المترجمة.
  • \n
\n\n

هذه الطريقة مثالية لـ 90% من الحالات. ولكن إذا كنت تكتب محللاً للسجلات أو تعالج ملفات CSV بملايين الأسطر — تابع القراءة.

\n\n

2. استخدام NumberFormatter: للسلاسل النصية "غير النظيفة"

\n\n

العالم الحقيقي ليس مثالياً. قد يدخل المستخدم " 42 " أو "$100" أو "1 234.56". هنا يأتي دور NumberFormatter — أداة قوية ولكنها بطيئة.

\n\n
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
\n\n

لكن تذكر: NumberFormatter ثقيل. إنشاءه مكلف، لذا قم دائماً بتخزين النسخة مؤقتاً كمتغير ثابت، ولا تنشئه من جديد لكل سلسلة نصية.

\n\n

3. Scanner (NSScanner) — قديم ولكنه سريع

\n\n

النهج الكلاسيكي من Objective-C — Scanner. يعمل أسرع من NumberFormatter، لكنه يتطلب الدقة.

\n\n
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 مرات. مثالي لتحليل البيانات المختلطة.

\n\n

4. دالة مخصصة: تحليل يدوي لأقصى سرعة

\n\n

إذا كنت تقرأ هذه المقالة على PythonLib، فأنت تعلم بالتأكيد: عندما تحتاج السرعة — اكتب يدوياً. للسلاسل الرقمية النقية (فقط الأحرف 0-9، وربما علامة ناقص) يمكنك كتابة محلل خاص بك.

\n\n
func fastInt(from string: String) -> Int? {\n    var result = 0\n    var isNegative = false\n    var started                

المدونات

توصيات الكتب