حياة جديدة للسلاسل النصية في Swift: وداعًا substring، مرحبًا slicing

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

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

ابدأ الدورة

كيف تتوقف عن الخوف من deprecated وتحب slicing في Swift



إذا كنت قد كتبت كودًا بلغة Swift وحاولت قص جزء من سلسلة نصية، فمن المحتمل أنك واجهت هذه الرسالة المخيفة: 'substring(to:)' is deprecated: Please use String slicing subscript with a 'partial range from' operator. هل تبدو كحكم بالإعدام؟ في الحقيقة، هذه دعوة إلى عالم جديد وأكثر أمانًا وقوة للعمل مع السلاسل النصية. دعنا نفهم ما حدث، ولماذا قررت Apple تغيير API المألوف، وكيف تقوم الآن بقص السلاسل النصية بشكل صحيح في Swift 4 والإصدارات الأحدث.



لماذا أصبح substring شيئًا من الماضي؟



كانت الطريقة القديمة substring(to:) تعمل، لكنها لم تكن... ذكية جدًا. كانت تُرجع كائنًا جديدًا من نوع Substring، والذي كان في جوهره مجرد "نافذة" على السلسلة الأصلية. أدى ذلك إلى حدوث ارتباك: كنت تظن أنك تعمل مع سلسلة مستقلة، بينما كنت في الواقع تحتفظ بمرجع للذاكرة القديمة. في Swift 4، قرروا ترتيب الأمور: الآن جميع عمليات السلاسل الفرعية تُرجع نوع Substring، وللحصول على سلسلة كاملة، تحتاج إلى تحويل النتيجة بشكل صريح. هل يبدو الأمر أكثر تعقيدًا؟ عمليًا، هو أكثر وضوحًا وأمانًا.



تعرف على: String slicing subscript



النهج الجديد يستخدم الاشتراكات (subscripts) والنطاقات (ranges). بدلاً من الطرق substring(to:) و substring(from:) و substring(with:)، ستكتب الآن كودًا يشبه العمل مع المصفوفات. إليك تشبيه أساسي:



let fullString = "مرحبًا بالعالم!"// الطريقة القديمة (مهملة)// let oldResult = fullString.substring(to: fullString.index(fullString.startIndex, offsetBy: 7))

// الطريقة الجديدةlet newResult = fullString[..<fullString.index(fullString.startIndex, offsetBy: 7)]print(newResult) // "مرحبًا "


هل ترى العامل ..<؟ هذا هو عامل النطاق الجزئي من البداية (partial range from operator) — نطاق جزئي "من البداية إلى الفهرس المحدد، دون تضمينه". قوي؟ بالتأكيد.



الأركان الثلاثة للنهج الجديد: from, to, through



دعنا نستعرض ثلاثة سيناريوهات رئيسية كانت تغطيها طرق substring سابقًا.



1. substring(to:) → prefix(upTo:) أو نطاق جزئي

هل تريد أخذ كل شيء حتى فهرس معين؟ استخدم ..< (نطاق نصف مفتوح) أو الطريقة prefix(upTo:):



let str = "مرحبًا، Swift"let index = str.firstIndex(of: "،") ?? str.endIndex

// الخيار باستخدام الاشتراكlet result1 = str[..<index]print(result1) // "مرحبًا"

// الخيار باستخدام الطريقةlet result2 = str.prefix(upTo: index)print(result2) // "مرحبًا"


2. substring(from:) → suffix(from:) أو نطاق جزئي

هل تحتاج إلى أخذ كل شيء من فهرس معين حتى النهاية؟ استخدم ... (نطاق مغلق) مع حذف البداية:



let startIndex = str.index(str.startIndex, offsetBy: 8)let result3 = str[startIndex...]print(result3) // "Swift"

// أو باستخدام الطريقةlet result4 = str.suffix(from: startIndex)print(result4) // "Swift"


3. substring(with:) → نطاق عادي

هل تريد قص جزء محدد؟ فقط حدد النطاق:



let range = str.index(str.startIndex, offsetBy: 8)..<str.endIndexlet result5 = str[range]print(result5) // "Swift"

// أو باستخدام نطاق مغلقlet closedRange = str.index(str.startIndex, offsetBy: 8)...str.index(before: str.endIndex)let result6 = str[closedRange]print(result6) // "Swift"


لاحظ: جميع هذه العمليات تُرجع Substring وليس String. إذا كنت بحاجة إلى سلسلة كاملة، فقط قم بتغليف النتيجة في String():



let newString = String(result1)print(type(of: newString)) // String


وماذا عن prefix و suffix؟ إنهما ليسا مهملين!



نعم، الطرق prefix(_:) و suffix

المدونات

توصيات الكتب