كيف تجتاز مقابلة Swift: أفضل الأسئلة من الألف إلى الياء

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

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

ابدأ الدورة

مقدمة: لماذا Swift هو مفتاح المقابلة الناجحة

\n

مقابلة Swift ليست مجرد اختبار للصياغة. نظام Apple البيئي يتطلب فهم المبادئ الأساسية للغة، وإدارة الذاكرة، والأطر الحديثة. في هذه المقالة، سنحلل أفضل الأسئلة التي سيتم طرحها عليك بالتأكيد في أي مستوى - من مبتدئ إلى خبير. ستتعلم ليس فقط الإجابات الصحيحة، ولكن أيضًا الأخطاء النموذجية التي يقع فيها المرشحون.

\n

المقالة مكتوبة لبوابة PythonLib التعليمية، ولكنها مُكيَّفة لـ Swift. قمنا بتنظيم المحتوى بحيث يمكنك مراجعة الموضوعات الرئيسية بسرعة قبل المقابلة.

\n\n

1. أساسيات Swift: Optional، أنواع القيم مقابل الأنواع المرجعية

\n

ما هو Optional ولماذا هو مطلوب؟

\n

Optional هو تعداد (enum) يمكن أن يكون إما .none (nil) أو .some(Wrapped). هذه هي طريقة Swift للعمل بأمان مع غياب القيمة.

\n
var name: String? = "Alice"\nvar age: Int? = nil\n\n// استخراج آمن\nif let unwrappedName = name {\n    print("Hello, \\(unwrappedName)")\n} else {\n    print("Name is nil")\n}
\n

خطأ نموذجي: استخدام force unwrap (!) بدون تحقق. دائمًا فضّل guard let أو if let.

\n\n

أنواع القيم مقابل الأنواع المرجعية

\n

يقسم Swift الأنواع بدقة:

\n
    \n
  • أنواع القيم (الهياكل، التعدادات، الأنواع الأساسية) - تُنسخ عند التعيين.
  • \n
  • الأنواع المرجعية (الفئات) - تُمرر بالمرجع.
  • \n
\n
struct Point {\n    var x: Int\n    var y: Int\n}\n\nclass Car {\n    var model: String\n    init(model: String) { self.model = model }\n}\n\nvar point1 = Point(x: 1, y: 2)\nvar point2 = point1\npoint2.x = 5 // point1.x سيبقى 1\n\nvar car1 = Car(model: "Tesla")\nvar car2 = car1\ncar2.model = "BMW" // car1.model سيصبح أيضًا "BMW"
\n

سؤال في المقابلة: "لماذا توصي Apple باستخدام الهياكل بدلاً من الفئات؟" الإجابة: أمان الخيوط، قابلية التوقع، عدم وجود عبء ARC.

\n\n

2. إدارة الذاكرة و ARC: كيفية تجنب التسريبات

\n

كيف يعمل العد التلقائي للمراجع (ARC)؟

\n

يقوم ARC تلقائيًا بحساب المراجع لكائنات الفئات. عندما يصل العداد إلى الصفر، يتم تحرير الذاكرة. تنشأ المشاكل عند وجود مراجع دائرية.

\n
class Person {\n    let name: String\n    var apartment: Apartment?\n    init(name: String) { self.name = name }\n    deinit { print("\\(name) deallocated") }\n}\n\nclass Apartment {\n    let unit: String\n    weak var tenant: Person?  // weak - مرجع ضعيف\n    init(unit: String) { self.unit = unit }\n    deinit { print("Apartment \\(unit) deallocated") }\n}\n\nvar john: Person? = Person(name: "John")\nvar unit4A: Apartment? = Apartment(unit: "4A")\njohn?.apartment = unit4A\nunit4A?.tenant = john\njohn = nil\nunit4A = nil\n// سيتم تحرير كلا الكائنين
\n

المُعدِّلات الرئيسية:

\n
    \n
  • weak - دائمًا optional، يصبح تلقائيًا nil عند التحرير.
  • \n
  • unowned - ليس optional، يفترض أن الكائن حي (خطر تعطل).
  • \n
\n

سؤال نموذجي: "ما الفرق بين weak و unowned؟" الإجابة: weak أكثر أمانًا، unowned أكثر ملاءمة للتبعيات الإلزامية (مثل المفوض).

\n\n

3. الأطر: UIKit مقابل SwiftUI، GCD والبروتوكولات

\n

UIKit: دورة حياة ViewController ونمط المفوض

\n

فهم viewDidLoad، viewWillAppear، viewDidDisappear - أساسي. ولكن في المقابلة غالبًا ما يُسأل عن نمط المفوض:

\n
protocol MyDelegate: AnyObject {\n    func didTapButton()\n}\n\nclass MyView: UIView {\n    weak var delegate: MyDelegate?\n    \n    @objc func buttonTapped() {\n        delegate?.didTapButton()\n    }\n}\n\nclass MyViewControlle                

المدونات

توصيات الكتب