Swift: كيف تستبدل الأحرف في سلسلة نصية؟ شرح كامل للمبتدئين
\n\nعاجلاً أم آجلاً، يواجه كل مطور Swift مهمة: استبدال أحرف معينة في سلسلة نصية بأخرى. قد يبدو الأمر بسيطاً، لكن المبتدئين غالباً ما يشعرون بالارتباك لأن Swift String ليست مصفوفة أحرف كما في C، بل هي بنية معقدة متوافقة مع Unicode. في هذه المقالة، سنستعرض أشهر وأكثر الطرق فعالية لاستبدال الأحرف في Swift، من البسيطة إلى المتقدمة.
\n\nلن نقوم بسرد الطرق بشكل جاف. بدلاً من ذلك، سنحلل أمثلة واقعية ستواجهها في التطبيق العملي: من استبدال المسافات إلى حذف علامات الترقيم والتعامل مع الرموز التعبيرية. هيا بنا!
\n\nلماذا Swift String ليست مجرد مصفوفة أحرف؟
\nقبل تغيير الأحرف، من المهم فهم كيفية عمل السلسلة النصية في Swift. String هي مجموعة من Character، لكن كل Character قد يتكون من عدة وحدات Unicode (مثل الرمز التعبيري 🚀 أو الحرف «ё» مع علامات التشكيل). لذلك، لا يعمل الفهرسة باستخدام Int بشكل مباشر. بدلاً من ذلك، يستخدم Swift String.Index.
لكن لاستبدال الأحرف، لست بحاجة للغوص في تفاصيل الفهارس — فهناك طرق جاهزة عالية المستوى. دعنا نلقي نظرة على أشهرها.
\n\nالطريقة رقم 1: replacingOccurrences — ملك الاستبدال
\nأبسط وأوضح طريقة هي استخدام الدالة replacingOccurrences(of:with:). تقوم بإرجاع سلسلة نصية جديدة مع استبدال التكرارات. تبقى السلسلة الأصلية دون تغيير (Swift لغة ذات سلاسل نصية غير قابلة للتغيير افتراضياً).
let original = "Hello, World!"\nlet replaced = original.replacingOccurrences(of: "World", with: "Swift")\nprint(replaced) // "Hello, Swift!"\nprint(original) // "Hello, World!" — الأصل لم يتغير\n\nهذه الطريقة مثالية للحالات البسيطة: استبدال كلمة واحدة، حرف أو سلسلة فرعية. لكن ماذا لو كنت بحاجة لاستبدال عدة أحرف مختلفة؟ مثلاً، إزالة كل المسافات والنقاط؟
\n\nسلسلة من الاستدعاءات للاستبدالات المتعددة
\nيمكنك استدعاء replacingOccurrences عدة مرات متتالية:
let text = "Hello, World! How are you?"\nlet cleaned = text\n .replacingOccurrences(of: ",", with: "")\n .replacingOccurrences(of: "!", with: "")\n .replacingOccurrences(of: " ", with: "_")\nprint(cleaned) // "Hello_World_How_are_you?"\n\nالعيب: إذا كانت الاستبدالات كثيرة، يصبح الكود ضخماً. في مثل هذه الحالات، من الأفضل استخدام طرق أخرى أو التعبيرات المنتظمة.
\n\nالطريقة رقم 2: الاستبدال باستخدام map و filter (المنهج الوظيفي)
\nSwift ليس فقط برمجة كائنية التوجه، بل أيضاً برمجة وظيفية. يمكنك المرور على كل حرف في السلسلة النصية باستخدام map واستبدالها حسب شرط. هذا مفيد بشكل خاص عندما تحتاج لاستبدال جميع تكرارات مجموعة معينة من الأحرف.
let input = "a1b2c3d4"\nlet result = input.map { char -> Character in\n if char.isNumber {\n return "X"\n } else {\n return char\n }\n}\nprint(String(result)) // "aXbXcXdX"\n\nهنا قمنا باستبدال جميع الأرقام بـ "X". وإذا كنت بحاجة لحذف الأحرف؟ استخدم filter:
let withPunctuation = "Hello!!! How are you??"\nlet noPunctuation = withPunctuation.filter { !$0.isPunctuation }\nprint(noPunctuation) // "Hello How are you"\n\nهذا المنهج مرن جداً: يمكنك استخدام أي فحوصات — isNumber، isLetter، isWhitespace أو حتى المقارنة مع مجموعة من الأحرف.
الطريقة رقم 3: التعبيرات المنتظمة (NSRegularExpression)
\nعندما تصبح المهمة أكثر تعقيداً (الاستبدال وفق نمط، حذف جميع عناوين البريد الإلكتروني، استبدال التواريخ)، لا غنى عن التعبيرات المنتظمة. يدعم Swift NSRegularExpression من Foundation.
\n\nimport Foundation\n\nlet text = "My email is test@example.com and your is user@test.org"\nlet regex = try! NSRegularExpression