كيف تجتاز مقابلة Swift: أهم الأسئلة والإجابات

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

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

ابدأ الدورة

كيف تجتاز مقابلة Swift: أهم الأسئلة



مقابلة العمل لوظيفة مطور iOS لا تختبر فقط معرفتك بالأطر (frameworks)، بل أيضاً فهمك العميق للغة Swift. يرغب أصحاب العمل في رؤية مرشح يفهم إدارة الذاكرة، والتزامن، وخصائص بناء الجملة. في هذا المقال، جمعنا أهم الأسئلة التي تُطرح غالباً في المقابلات، مع إجابات مفصلة وأمثلة كود. سيكون المقال مفيداً للمبتدئين (juniors) والمطورين ذوي الخبرة الذين يرغبون في تحديث معلوماتهم قبل المقابلة.



1. أساسيات Swift: الأنواع، الخيارات (Optionals) وإدارة الذاكرة



تختبر الأسئلة الأساسية مدى فهمك للمفاهيم الجوهرية للغة. لنبدأ بالأكثر شيوعاً — الخيارات (Optionals).



السؤال 1: ما هي الخيارات (Optionals) ولماذا هي مطلوبة؟



الإجابة: الخيارات (Optionals) هي آلية أمان للأنواع (type safety mechanism) تسمح للمتغير إما أن يحتوي على قيمة أو أن يكون nil (غياب القيمة). إنها تحل مشكلة المؤشرات الفارغة (null-pointers) الشائعة في اللغات الأخرى.



// تعريف خيار (Optional)var name: String? = "آنا"name = nil // الآن المتغير لا يحتوي على قيمة

// استخراج آمن (optional binding)if let unwrappedName = name { print("مرحباً، \\(unwrappedName)")} else { print("الاسم غير موجود")}

// استخراج إجباري (force unwrap) — خطير!// let forcedName = name! // تعطل (crash) إذا كان name == nil


السؤال 2: ما الفرق بين struct و class؟



الإجابة: struct هو نوع قيمي (value type)، بينما class هو نوع مرجعي (reference type). يتم نسخ الهياكل (structs) عند التعيين، بينما يتم تمرير الفئات (classes) بالمرجع. بالإضافة إلى ذلك، تدعم الفئات الوراثة (inheritance)، بينما لا تدعمها الهياكل.



struct Point {    var x: Int    var y: Int}

class Person { var name: String init(name: String) { self.name = name }}

var pointA = Point(x: 1, y: 2)var pointB = pointA // نسخةpointB.x = 10print(pointA.x) // 1 — الأصل لم يتغير

var personA = Person(name: "إيفان")var personB = personA // مرجع لنفس الكائنpersonB.name = "بيتر"print(personA.name) // "بيتر" — تغير


السؤال 3: كيف يعمل العد التلقائي للمراجع (Automatic Reference Counting - ARC)؟



الإجابة: يقوم ARC تلقائياً بحساب عدد المراجع القوية (strong references) لكائن من فئة (class). عندما يصل العداد إلى الصفر، يتم تحرير الكائن من الذاكرة. تنشأ المشاكل عند وجود مراجع دائرية (retain cycles)، والتي يتم حلها باستخدام مراجع weak أو unowned.



class Parent {    var child: Child?}

class Child { weak var parent: Parent? // weak يمنع retain cycle}

var parent: Parent? = Parent()var child: Child? = Child()parent?.child = childchild?.parent = parent


2. مفاهيم متقدمة: الإغلاقات (Closures)، البروتوكولات (Protocols) والعوامل العامة (Generics)



في المرحلة التالية، يختبر المحاور ما إذا كنت تجيد استخدام الإمكانيات الوظيفية لـ Swift.



السؤال 4: ما هي الإغلاقات (closures) وكيف تلتقط القيم؟



الإجابة: الإغلاق (closure) هو كتلة من الكود يمكن تمريرها واستخدامها كدالة. إنه يلتقط (captures) المتغيرات من السياق المحيط. يمكن أن يكون الالتقاط قوياً (strong) أو ضعيفاً (weak).



func makeIncrementer(incrementAmount: Int) -> () -> Int {    var total = 0    let incrementer: () -> Int = {        total += incrementAmount // التقاط total        return total    }    return incrementer}

let incrementByTwo = makeIncrementer(incrementAmount: 2)print(incrementByTwo()) // 2print(incrementByTwo()) // 4


السؤال 5: ما الفرق بين البروتوكول (Protocol) والفئة المجردة (Abstract Class)؟



الإجابة: لا توجد فئات مجردة (abstract classes) في Swift. يحدد البروتوكول عقداً (متطلبات) يجب أن تنفذه الفئات (classes)، الهياكل (structs)، أو التعدادات (enums).

المدونات

توصيات الكتب