مقدمة: لماذا يعتبر تقسيم السلسلة النصية أساسًا يجب على كل مطور Swift معرفته
\n\nتخيل موقفًا: تقوم بتحليل ملف CSV، أو معالجة إدخال المستخدم من حقل نصي، أو تحليل سلسلة نصية تشبه JSON. ماذا تفعل؟ صحيح — تقوم بتقسيم السلسلة النصية إلى مصفوفة. سؤال "Split a String into an array in Swift?" على Stack Overflow حصل على أكثر من 20,000 مشاهدة وأصبح من أكثر الأسئلة شيوعًا بين مطوري iOS المبتدئين. لماذا؟ لأنه بدون هذه المهارة لا يمكنك كتابة أي مشروع جاد في Swift.
\n\nفي هذه المقالة، سنستعرض جميع الطرق الممكنة لتقسيم سلسلة نصية إلى مصفوفة في Swift: من الطريقة الكلاسيكية components(separatedBy:) إلى الطريقة الحديثة split(separator:) والحيل الذكية باستخدام التعبيرات المنتظمة. ستتعرف على الطريقة المناسبة حسب المهمة، وستحصل على أمثلة جاهزة للكود يمكنك إدراجها فورًا في مشروع Xcode الخاص بك.
1. الطريقة الكلاسيكية: components(separatedBy:)
\n\nهذه الطريقة جاءت إلينا من Objective-C وما زالت تُستخدم بنشاط. إنها بسيطة وواضحة وتعمل بدقة. components(separatedBy:) تُرجع مصفوفة من السلاسل النصية [String]، مفصولة بالفاصل المحدد.
import Foundation\n\nlet text = "تفاحة,موز,برتقال,كيوي"\nlet fruits = text.components(separatedBy: ",")\nprint(fruits) // ["تفاحة", "موز", "برتقال", "كيوي"]\n\nملاحظات هامة حول طريقة components(separatedBy:):
\n- \n
- الفاصل هو سلسلة نصية. يمكنك تمرير أي
String، حتى لو كان مكونًا من عدة أحرف:"::"،" - ". \n - العناصر الفارغة تُحتفظ بها. إذا لم يكن هناك شيء بين الفواصل، ستظهر سلسلة نصية فارغة في المصفوفة. \n
- يتطلب استيراد Foundation. بدون الاستيراد، الطريقة غير متاحة. \n
let data = "a,,b,c"\nlet parts = data.components(separatedBy: ",")\nprint(parts) // ["a", "", "b", "c"]\n\nهذه الطريقة مثالية عندما تحتاج ببساطة وسرعة إلى تقسيم سلسلة نصية إلى مصفوفة في Swift دون تعقيدات إضافية. لكن تذكر: أنها لا تزيل السلاسل النصية الفارغة تلقائيًا.
\n\n2. الطريقة الحديثة: split(separator:maxSplits:omittingEmptySubsequences:)
\n\nبدءًا من Swift 2.0، لدينا الطريقة الأصلية split(). إنها أكثر مرونة و"سويفتية". على عكس components، فإن split تُرجع مصفوفة من Substring، وليس String. تم ذلك لتحسين الأداء — حيث تشير السلاسل النصية الفرعية إلى ذاكرة السلسلة النصية الأصلية.
let sentence = "الثعلب البني السريع يقفز فوق الكلب الكسول"\nlet words = sentence.split(separator: " ")\nprint(words) // ["الثعلب", "البني", "السريع", "يقفز", "فوق", "الكلب", "الكسول"]\n\nمعاملات طريقة split:
\n- \n
separator— حرف الفاصل (Character). \n maxSplits— الحد الأقصى لعدد التقسيمات (الافتراضيInt.max). \n omittingEmptySubsequences— هل يجب إزالة السلاسل النصية الفرعية الفارغة (الافتراضيtrue). \n
let csvLine = "1,2,,4,5"\nlet withEmpties = csvLine.split(separator: ",", omittingEmptySubsequences: false)\nprint(withEmpties) // ["1", "2", "", "4", "5"]\n\nlet withoutEmpties = csvLine.split(separator: ",", omittingEmptySubsequences: true)\nprint(withoutEmpties) // ["1", "2", "4", "5"]\n\nإذا كنت بحاجة إلى تقسيم سلسلة نصية إلى مصفوفة من Substring في Swift وتريد التحكم في العناصر الفارغة — اختر split. وللحصول على [String]، أضف ببساطة .map(String.init).
let result: [String] = "a,b,c".split(separator: ",").map(String.init)\nprint(result) // ["a", "b", "c"]\n\n