كيفية التحقق من وجود مفتاح في قاموس Swift والحصول على القيمة: 5 طرق

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

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

ابدأ الدورة

كيفية التحقق من وجود مفتاح في قاموس Swift والحصول على القيمة: دليل شامل للمبتدئين والمحترفين

\n\n

العمل مع القواميس هو الخبز اليومي لكل مطور iOS. ولكن بمجرد أن ننتقل من مجرد "وضع قيمة" إلى "هل يوجد هذا المفتاح أصلاً؟" — تبدأ الرقصات مع الطبول. هذا السؤال حصد آلاف المشاهدات على Stack Overflow، وليس من دون سبب: فالمهمة التي تبدو بسيطة تخفي في طياتها عدة مطبات.

\n\n

في هذه المقالة، لن نجيب فقط على السؤال "Determining if Swift dictionary contains key and obtaining any of its values"، بل سنشرح بالتفصيل 5 طرق مختلفة. ستتعرف على أي طريقة أسرع، وأيها أكثر أماناً، وأيها مجرد كود أنيق من الممتع كتابته وقراءته.

\n\n

نبذة مختصرة: ما هو Dictionary في Swift؟

\n\n

لمن يتعرف على Swift لأول مرة: Dictionary هو مجموعة من أزواج "مفتاح-قيمة". المفاتيح فريدة، والقيم يمكن أن تتكرر. يبدو الأمر هكذا:

\n\n
var userScores: [String: Int] = [\n    "Alice": 95,\n    "Bob": 87,\n    "Charlie": 92\n]
\n\n

تخيل الآن: تريد الحصول على نتيجة لاعب اسمه "David". لكن David غير موجود في القاموس. إذا كتبت ببساطة userScores["David"]، فلن يتعطل Swift، بل سيعيد nil. وهنا يبدأ الجزء الممتع.

\n\n

الطريقة رقم 1: if let الكلاسيكي — الأساس الذي يجب أن يعرفه الجميع

\n\n

الطريقة الأبسط والأكثر قابلية للقراءة هي استخدام الربط الاختياري (optional binding) عبر if let. أنت تتحقق في نفس الوقت من وجود المفتاح وتحصل على القيمة:

\n\n
let scores: [String: Int] = ["Alice": 95, "Bob": 87]\n\nif let aliceScore = scores["Alice"] {\n    print("نتيجة أليس: \\(aliceScore)")\n} else {\n    print("اللاعب غير موجود")\n}
\n\n

المزايا:

\n
    \n
  • كود قابل للقراءة إلى أقصى حد
  • \n
  • عمل آمن مع القيم الاختيارية
  • \n
  • لا حاجة لاستدعاء دوال إضافية
  • \n
\n\n

العيوب:

\n
    \n
  • إذا كنت تحتاج فقط للتحقق من وجود المفتاح دون الحصول على القيمة — فهو مبالغ فيه
  • \n
\n\n

هذا الأسلوب هو المعيار الذهبي في 90% من الحالات. وهو ما توصي به وثائق Apple الرسمية.

\n\n

الطريقة رقم 2: Guard let — للخروج المبكر من الدالة

\n\n

إذا كنت تكتب دالة حيث عدم وجود المفتاح هو سبب للخروج الفوري، استخدم guard let. هذا يجعل الكود مسطحاً ويخلصك من "هرم الموت" الناتج عن if المتداخلة:

\n\n
func printScore(for player: String, in scores: [String: Int]) {\n    guard let score = scores[player] else {\n        print("اللاعب \\(player) غير موجود")\n        return\n    }\n    // هنا نحن متأكدون من وجود score\n    print("نتيجة اللاعب \\(player): \\(score)")\n}\n\nprintScore(for: "Bob", in: ["Alice": 95, "Bob": 87]) // نتيجة اللاعب Bob: 87\nprintScore(for: "David", in: ["Alice": 95, "Bob": 87]) // اللاعب David غير موجود
\n\n

المزايا:

\n
    \n
  • فصل واضح بين "مسار الخطأ" و"السيناريو الرئيسي"
  • \n
  • المتغير متاح في نطاق الرؤية بالكامل بعد guard
  • \n
\n\n

العيوب:

\n
    \n
  • غير مناسب إذا كنت تحتاج فقط للتحقق من الوجود دون الخروج من الدالة
  • \n
\n\n

الطريقة رقم 3: التحقق عبر contains(where:) — عندما يكون المفتاح معقداً

\n\n

أحياناً لا تحتاج فقط للعثور على مفتاح، بل للتحقق منه وفق شرط معين. مثلاً، المفتاح هو سلسلة نصية وأنت تبحث عن تطابق جزئي. هنا تأتي دالة contains(where:) للإنقاذ:

\n\n
let config: [String: Any] = [\n    "app_version": "2.1.0",\n    "build_number": 42,\n    "is_debug_mode": true\n]\n\n// نبحث عن مفتاح يبدأ بـ "app_"\nlet hasAppKey = config.keys.contains { $0.hasPrefix("app_") }\nprint("يوجد مفتاح app_: \\(hasAppKey)") // true\n\n// نحصل على القيمة حسب أول مفتاح تم العثور عليه\nif let appKey = confi                

المدونات

توصيات الكتب