مقدمة عن المهمة: لماذا NSURL و NSString مهمان جدًا؟
\n\nيواجه كل مطور iOS عاجلاً أم آجلاً مهمة: لديك كائن NSURL، لكنك تحتاج إلى الحصول منه على سلسلة نصية عادية — NSString (أو في Swift الحديث، ببساطة String). قد يبدو الأمر بسيطًا؟ ومع ذلك، هناك العديد من المزالق المخفية هنا: من فك تشفير الأحرف غير الصحيح إلى فقدان أجزاء من URL.
في Stack Overflow، جمع سؤال "تحويل NSURL إلى NSString" آلاف المشاهدات — إنه كلاسيكي حقيقي. قررنا في PythonLib تحليل الموضوع بدقة، حتى لا تضيع وقتك أبدًا في البحث عن حل. هيا بنا!
\n\nما هما NSURL و NSString في Swift؟
\n\nقبل الانتقال إلى الكود، دعنا نتذكر بسرعة ما نتعامل معه.
\n\nNSURL هو كائن يمثل مؤشرًا موحدًا للموارد (URL). يمكنه تحليل العناوين إلى مكونات: المخطط، المضيف، المسار، المعلمات، وهكذا. في Swift، حل محله النوع الأصلي URL، لكن NSURL لا يزال يُستخدم بنشاط في الكود القديم و Core Foundation وعند العمل مع مكتبات Objective-C.
NSString هو سلسلة نصية في Objective-C، والتي يتم ربطها تلقائيًا (bridges) في Swift بالنوع String. لذلك، عندما نقول "تحويل NSURL إلى NSString"، فإننا في الواقع نحصل إما على String أو NSString?.
الطرق الرئيسية لتحويل NSURL إلى NSString
\n\nدعنا نستعرض ثلاث طرق رئيسية. كل منها مناسب لسيناريوهات مختلفة.
\n\n1. استخدام الخاصية absoluteString
\n\nالطريقة الأكثر شيوعًا وسهولة. الخاصية absoluteString تُرجع سلسلة URL الكاملة، بما في ذلك جميع المكونات.
import Foundation\n\nlet url = NSURL(string: "https://pythonlib.ru/swift-guide?page=1&lang=ru")!\nlet urlString = url.absoluteString\n\nprint(urlString) // "https://pythonlib.ru/swift-guide?page=1&lang=ru"\n\nهام: absoluteString تُرجع سلسلة قد تحتوي على ترميز النسبة المئوية (percent-encoding). على سبيل المثال، ستظهر المسافات كـ %20، والأحرف السيريلية كـ %D0%9F.
2. الخاصية relativeString
\n\nإذا كان عنوان URL الخاص بك نسبيًا (لا يحتوي على مخطط ومضيف)، فإن relativeString ستعيد الجزء النسبي فقط.
let baseURL = NSURL(string: "https://pythonlib.ru")!\nlet relativeURL = NSURL(string: "swift-guide", relativeTo: baseURL)!\n\nlet absolute = relativeURL.absoluteString\nlet relative = relativeURL.relativeString\n\nprint(absolute) // "https://pythonlib.ru/swift-guide"\nprint(relative) // "/swift-guide"\n\nهذه الطريقة مفيدة بشكل خاص عند العمل مع عناوين URL الأساسية والمسارات النسبية.
\n\n3. تحليل مكونات URL يدويًا
\n\nأحيانًا لا تحتاج إلى URL كامل، بل إلى جزء منه فقط: المسار، المضيف، أو المعلمات. لهذا، استخدم خصائص NSURLComponents أو الوصول المباشر إلى NSURL.
let url = NSURL(string: "https://pythonlib.ru/ios/guide?query=swift#section1")!\n\nlet scheme = url.scheme ?? ""\nlet host = url.host ?? ""\nlet path = url.path ?? ""\nlet query = url.query ?? ""\nlet fragment = url.fragment ?? ""\n\nprint("المخطط: \\(scheme)")\nprint("المضيف: \\(host)")\nprint("المسار: \\(path)")\nprint("المعلمات: \\(query)")\nprint("المرساة: \\(fragment)")\n\nيمنحك هذا النهج أقصى تحكم فيما تستخرجه بالضبط.
\n\nالأخطاء الشائعة وكيفية تجنبها
\n\nحتى المطورين ذوي الخبرة يتعثرون أحيانًا في الأمور البسيطة. إليك ثلاث مشكلات شائعة عند تحويل NSURL إلى NSString.
الخطأ 1: نسيان الاختيارية
\n\nNSURL(string:) يُرجع نوعًا اختياريًا NSURL?. إذا كانت السلسلة