دليل شامل للتحقق من وجود نص فرعي في Swift مع أمثلة

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

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

ابدأ الدورة

كيف تتحقق مما إذا كانت السلسلة النصية تحتوي على نص فرعي في Swift؟ دليل شامل

\n\n

مرحبًا يا زميل المطور! إذا سبق لك أن كتبت كودًا بلغة Swift وتساءلت: "كيف يمكنني العثور على كلمة داخل كلمة أخرى؟"، فأنت في المكان الصحيح. هذا الموضوع من أكثر الأسئلة شيوعًا على Stack Overflow (النسخة الإنجليزية حصدت مئات الآلاف من المشاهدات). وهذا ليس مصادفة: فالتعامل مع النصوص هو أساس لا يمكن الاستغناء عنه في أي تطبيق.

\n\n

في هذا المقال، سنستعرض جميع الطرق المعتمدة للتحقق مما إذا كانت السلسلة النصية تحتوي على نص فرعي. بدءًا من أبسط طريقة contains() وصولاً إلى التقنيات المتقدمة مثل البحث غير الحساس لحالة الأحرف والتعبيرات المنتظمة. هيا بنا!

\n\n

1. الطريقة الأسهل: دالة contains()

\n\n

منذ Swift 1.0، لدينا دالة مدمجة contains() في نوع String. تعمل بشكل بديهي وسريع جدًا.

\n\n
let fullString = "مرحبًا، عالم Swift!"\nlet searchString = "Swift"\n\nif fullString.contains(searchString) {\n    print("نعم، السلسلة تحتوي على '\\(searchString)'")\n} else {\n    print("لا، لا تحتوي")\n}\n// الإخراج: نعم، السلسلة تحتوي على 'Swift'
\n\n

ملاحظة مهمة: دالة contains() حساسة لحالة الأحرف. أي أن "swift" لن يتم العثور عليه في السلسلة "Swift". لكننا سنحل هذه المشكلة لاحقًا.

\n\n

2. البحث غير الحساس لحالة الأحرف: localizedCaseInsensitiveContains()

\n\n

غالبًا ما نحتاج إلى البحث عن كلمة دون الاهتمام بالأحرف الكبيرة والصغيرة. لهذا الغرض، توجد دالة خاصة تراعي إعدادات اللغة الخاصة بالمستخدم.

\n\n
let text = "أهلاً بك في Swift"\nlet search = "swift"\n\nif text.localizedCaseInsensitiveContains(search) {\n    print("تم العثور! حالة الأحرف لا تهم.")\n} else {\n    print("لم يتم العثور")\n}\n// الإخراج: تم العثور! حالة الأحرف لا تهم.
\n\n

تستخدم هذه الدالة الإعدادات المحلية الحالية للجهاز، وهو أمر مهم بشكل خاص للغات ذات قواعد مقارنة خاصة (مثل التركية، حيث "i" و "I" حرفان مختلفان).

\n\n

3. البحث مع مراعاة الإعدادات المحلية: localizedStandardContains()

\n\n

دالة مفيدة أخرى هي localizedStandardContains(). تقوم بالبحث بنفس الطريقة التي يعمل بها البحث القياسي في iOS (مثل Spotlight أو Finder).

\n\n
let fileName = "صور_العطلة_2024.jpg"\nlet query = "العطلة"\n\nif fileName.localizedStandardContains(query) {\n    print("تم العثور على الملف!")\n}\n// الإخراج: تم العثور على الملف!
\n\n

تقوم هذه الدالة تلقائيًا بتطبيع النصوص، وإزالة علامات التشكيل (مثل "é" = "e") وتعمل بشكل غير حساس لحالة الأحرف. مثالية لصناديق البحث في واجهة المستخدم.

\n\n

4. الطريقة التقليدية: range(of:)

\n\n

أحيانًا لا نحتاج فقط إلى معرفة ما إذا كان النص الفرعي موجودًا، بل نحتاج أيضًا إلى الحصول على موقعه. هنا تأتي دالة range(of:) للإنقاذ. تقوم بإرجاع نطاق اختياري (Range<String.Index>?).

\n\n
let phrase = "نتعلم Swift على pythonlib.ru"\nlet word = "Swift"\n\nif let range = phrase.range(of: word) {\n    print("تم العثور على النص الفرعي في الموضع: \\(range.lowerBound)")\n    // يمكننا حتى استخراج جزء من السلسلة\n    let extracted = phrase[range]\n    print("المستخرج: \\(extracted)")\n} else {\n    print("لم يتم العثور على النص الفرعي")\n}
\n\n

للبحث غير الحساس لحالة الأحرف باستخدام range، استخدم الخيار .caseInsensitive:

\n\n
if let range = phrase.range(of: "swift", options: .caseInsensitive) {\n    print("تم العثور بدون مراعاة حالة الأحرف: \\(phrase[range])")\n}
\n\n

5. التحقق من بداية ونهاية السلسلة النصية

\n\n

أحيانًا نحتاج إلى التحقق ليس من "هل تحتوي بشكل عام"، بل من "هل تبدأ بـ..." أو "هل تنتهي بـ...". لهذا الغرض، توجد دوال خاصة:

\n\n
let url = "https://pythonlib.ru"\n\nif url.hasPrefix("https://") {\n    print("هذا رابط آمن")\n}\n\nif url.hasSuffix(".ru") {\n    print("نطاق روسي")\n}
\n\n

كلا الدالتين حساسة لحالة الأحرف أيضًا.

المدونات

توصيات الكتب