كيفية تحويل Swift Array إلى String؟ برنامج تعليمي كامل مع أمثلة
\n\nمرحبًا، مطور iOS المستقبلي! إذا كنت قد تساءلت يومًا "How do I convert a Swift Array to a String؟" — فأنت لست وحدك. هذا السؤال حصد آلاف المشاهدات على Stack Overflow، واليوم سنحله نهائيًا. لماذا تحتاج هذا؟ تخيل: أنت تجمع بيانات من نموذج، أو تسجل أخطاء، أو تحضر نصًا للإرسال إلى الخادم. في كل هذه الحالات، تحتاج إلى تحويل المصفوفة إلى سلسلة نصية قابلة للقراءة. هيا بنا!
\n\nأبسط طريقة: طريقة joined()
\n\nفي Swift، لدمج مصفوفة من السلاسل النصية في سلسلة واحدة، نستخدم طريقة joined(). هذا هو أقصر طريق من المصفوفة إلى السلسلة النصية. ألقِ نظرة على المثال الأساسي:
let fruits = ["تفاحة", "موز", "برتقال"]\nlet fruitsString = fruits.joined()\nprint(fruitsString) // الإخراج: "تفاحةموزبرتقال"\n\nومع ذلك، تبدو النتيجة ملتصقة. لجعل السلسلة النصية قابلة للقراءة، استخدم joined(separator:) — الذي يضيف فاصلًا بين العناصر:
let fruits = ["تفاحة", "موز", "برتقال"]\nlet fruitsString = fruits.joined(separator: ", ")\nprint(fruitsString) // الإخراج: "تفاحة, موز, برتقال"\n\nهام: joined() يعمل فقط مع المصفوفات التي تحتوي على سلاسل نصية ([String]). إذا كان لديك مصفوفة أرقام أو أنواع أخرى، يجب أولاً تحويل كل عنصر.
طريقة شاملة: map() + joined()
\n\nماذا تفعل إذا كان لديك مصفوفة من الأعداد الصحيحة ([Int])، أو الأعداد العشرية ([Double])، أو، على سبيل المثال، هياكل مخصصة؟ هنا تأتي map() للإنقاذ. هذه الطريقة تحول كل عنصر وفقًا لقاعدة معينة، ثم ندمج النتيجة:
let numbers = [1, 2, 3, 4, 5]\nlet numbersString = numbers.map { String($0) }.joined(separator: ", ")\nprint(numbersString) // الإخراج: "1, 2, 3, 4, 5"\n\nهنا، map { String($0) } يحول كل رقم إلى سلسلة نصية. بعد ذلك، يسهل دمج مصفوفة السلاسل النصية عبر joined().
مثال مع كائنات معقدة
\n\nلنفترض أن لديك مصفوفة من المستخدمين، وتحتاج إلى الحصول على سلسلة نصية بأسمائهم:
\n\nstruct User {\n let name: String\n let age: Int\n}\n\nlet users: [User] = [\n User(name: "آنا", age: 25),\n User(name: "بوريس", age: 30),\n User(name: "فيكتوريا", age: 28)\n]\n\nlet namesString = users.map { $0.name }.joined(separator: ", ")\nprint(namesString) // الإخراج: "آنا, بوريس, فيكتوريا"\n\nطريقة متقدمة: reduce(into:)
\n\nطريقة reduce(into:) هي أداة أكثر مرونة. تتيح لك تجميع سلسلة نصية مع تحكم كامل في العملية. على سبيل المثال، يمكنك إضافة بادئة، لاحقة، أو ترقيم العناصر:
let colors = ["أحمر", "أخضر", "أزرق"]\nlet result = colors.reduce(into: "ألواني: ") { (partialResult, color) in\n partialResult += color + ", "\n}\n// إزالة آخر ", " إذا لزم الأمر\nlet finalString = String(result.dropLast(2))\nprint(finalString) // الإخراج: "ألواني: أحمر, أخضر, أزرق"\n\nلاحظ: نحن نزيل آخر حرفين يدويًا (الفاصلة والمسافة). هذا يجعل الكود أقل أناقة من joined()، لكن reduce لا غنى عنه عندما تحتاج إلى منطق تجميع معقد.
معالجة القيم الاختيارية (Optionals)
\n\nفي المشاريع الحقيقية، غالبًا ما تحتوي المصفوفات على nil. إذا قمت ببساطة باستدعاء joined()، سيعطي المترجم خطأ. الحل هو تصفية nil باستخدام compactMap():
let optionalStrings: [String?] = ["مرحبًا", nil, "العالم", nil, "Swift"]\nlet safeString = optionalStrings.compactMap { $0 }.joined(separator: " ")\nprint(safeString) // الإخراج: "مرحبًا العالم Swift"\n\ncompactMap { $0 } يتجاهل تلقائيًا جميع قيم nil ويعيد