Swift هي لغة برمجة حديثة من Apple، تم تقديمها في WWDC 2014 كبديل لـ Objective-C. تجمع Swift بين السلامة النوعية والإدارة التلقائية للذاكرة ARC (Automatic Reference Counting) والنهج الموجه بالبروتوكولات. Swift Programming Language هو المصدر الرئيسي لبناء الجملة والمكتبة القياسية للغة.
أهم النقاط
Swift هي لغة برمجة متعددة النماذج طورتها Apple لأنظمة iOS وmacOS وwatchOS وtvOS وvisionOS. الأهداف الرئيسية للغة: الأمان والسرعة والتعبير التركيبي. تستخدم Swift مترجم LLVM وتولد كود آلة محسّن، يمكن مقارنته بالأداء مع C++.
منذ إصدارها في 2014، مرت Swift بـ 6 إصدارات رئيسية. قدم Swift 6 (2024) نموذجًا كاملاً لأمان تسابق البيانات من خلال التحكم الصارم في عزل الكود المتزامن. وفقًا لـ GitHub Octoverse 2025، تدخل Swift ضمن أفضل 10 لغات من حيث نمو المجتمع، متجاوزة Rust وKotlin في سرعة التبني على منصات Apple.
Swift هي مفتوحة المصدر ومتعددة المنصات — يتم نشر الكود المصدري على GitHub (Swift Open Source). بالإضافة إلى منصات Apple، تُستخدم Swift على Linux وWindows للتطوير الخادمي (Vapor, Hummingbird)، على الرغم أن مجالها الرئيسي يبقى التطوير المحمول وسطح المكتب في نظام Apple البيئي.
الأسباب الرئيسية للانتقال: تقضي Swift على فئات كاملة من الأخطاء الممكنة في Objective-C. السلامة النوعية تمنع عدم تطابق الأنواع في وقت الترجمة. Optionals تلغي إلغاء مرجع nil. ARC مدمج منذ اليوم الأول، على عكس MRC/ARC في Objective-C. تركيب Swift أقصر وأكثر قابلية للقراءة — تظهر الدراسات تقليص حجم الكود بنسبة 30-40% مقارنة بـ Objective-C للمهام المكافئة.
بناء جملة Swift الأساسي يجمع بين التراكيب المألوفة الشبيهة بـ C وعناصر من اللغات الوظيفية. تُعلن المتغيرات بـ var، والثوابت بـ let. يستخدم المترجم استنتاج الأنواع، لذلك يتطلب التصريح النوعي الصريح فقط في حالات الغموض.
import Foundation
// الثوابت والمتغيرات
let name = "Swift"
var version = 6.0
var count: Int = 42
// الدوال ذات المعاملات الافتراضية
func greet(person: String, greeting: String = "Hello") -> String {
return "\(greeting), \(person)!"
}
// Guard-let للخروج المبكر
func parse(input: String?) -> Int {
guard let value = input, let number = Int(value) else {
return 0
}
return number
}Switch ومطابقة الأنماط في Swift أقوى منها في C وKotlin. يدعم Switch المطابقة مع الصفوف tuple والنطاقات وشروط where وربط القيم. يتحقق المترجم من التغطية الشاملة لجميع الحالات — عدم وجود default ليس خطأ إذا كانت جميع القيم الممكنة مغطاة.
let point = (x: 3, y: -1)
switch point {
case (0, 0):
print("نقطة الأصل")
case let (x, y) where x == y:
print("X يساوي Y")
case let (x, y) where abs(y) > x:
print("القيمة المطلقة لـ Y أكبر من X")
default:
print("النقطة (\(point.x), \(point.y))")
}Optionals هي مفهوم أساسي في Swift يحل مشكلة المراجع الفارغة على مستوى نظام الأنواع. Optional
var optionalString: String? = "Hello"
optionalString = nil // مسموح
// Optional Binding — الاستخراج الآمن
if let text = optionalString {
print("النص: \(text)")
} else {
print("القيمة غير موجودة")
}
// Optional Chaining — الوصول الآمن إلى الخصائص
let length = optionalString?.count ?? 0
// عامل nil-coalescing
let greeting = optionalString ?? "Default"Optional Chaining مع العامل ?. يتيح استدعاء الطرق والوصول إلى خصائص قيمة اختيارية بأمان. إذا انقطعت السلسلة بـ nil، تكون نتيجة التعبير بالكامل nil. Nil-coalescing (??) يوفر قيمة افتراضية ويُستخدم على نطاق واسع في كود واجهة المستخدم لعرض نص placeholder.
البروتوكولات في Swift تحدد عقدًا — مجموعة من الخصائص والطرق. على عكس واجهات Java، يمكن للبروتوكولات في Swift أن تحتوي على تطبيقات افتراضية عبر protocol extensions. هذا هو أساس البرمجة الموجهة بالبروتوكولات، النهج الموصى به من Apple بدلاً من وراثة الفئات.
protocol NamedEntity {
var name: String { get }
func description() -> String
}
// تطبيق افتراضي عبر extension
extension NamedEntity {
func description() -> String {
return "Entity: \(name)"
}
}
// المطابقة عبر extension
extension String: NamedEntity {
var name: String { return self }
}Protocol Extensions تسمح بإضافة طرق إلى بروتوكول دون تعديل كل نوع مطابق. هذا مفيد بشكل خاص لإضافة أدوات مساعدة شائعة: map وfilter وreduce لـ Sequence، أو Codable لتسلسل JSON. بنت Apple العديد من الأطر (SwiftUI, Combine) على البروتوكولات مع الإضافات.
الإغلاقات (Closures) في Swift هي دوال مجهولة تلتقط المتغيرات من السياق الخارجي. من حيث التركيب، تشبه الإغلاقات lambdas في Kotlin ولكن بتركيب أكثر مرونة: trailing closure وأسماء وسائط مختصرة ($0, $1) وautoclosures.
// إغلاق مع التقاط السياق
let numbers = [5, 3, 8, 1, 9]
// Trailing closure syntax
let sorted = numbers.sorted { $0 < $1 }
// سلسلة وظيفية
let result = numbers
.filter { $0 > 3 }
.map { $0 * 2 }
.reduce(0, +)
// إغلاق كمعامل دالة
func performAsync(completion: @escaping (Result<Data, Error>) -> Void) { }إغلاقات @escaping تُستخدم عندما يتم تنفيذ الإغلاق بعد عودة الدالة — وهو أمر معتاد لطلبات الشبكة والعمليات غير المتزامنة. @autoclosure يلف تعبيرًا تلقائيًا في إغلاق، ويُستخدم في assert والمنطق القصير.
الاختيار بين struct وclass هو أحد القرارات الأولى عند تصميم نموذج Swift. توصي Apple باستخدام struct افتراضيًا (نوع قيمة) والتحول إلى class (نوع مرجع) فقط عند الحاجة إلى الوراثة أو الهوية المرجعية.
| الخاصية | Struct | Class |
|---|---|---|
| نوع التمرير | بالقيمة (نسخ) | بالمرجع |
| الوراثة | غير مدعومة | مدعومة |
| إدارة ARC | غير مطلوبة | ARC (عدد المراجع) |
| deinit | لا | نعم |
| قابلية التغيير | mutating func لتعديل الخصائص | أي طريقة يمكنها التغيير |
| التخزين في المجموعات | يُنسخ عند الإدراج | تُخزن المرجع |
أنواع القيم (struct) أكثر أمانًا في البيئات متعددة الخيوط — كل خيط يحصل على نسخة مستقلة. أنواع المرجع (class) ضرورية للعمل مع UIKit (UIView, UIViewController) حيث تتطلب الهوية المرجعية والوراثة من فئات النظام.
ARC (Automatic Reference Counting) هو نظام إدارة الذاكرة في Swift لأنواع المرجع. يقوم المترجم بإدراج استدعاءات retain/release في وقت التشغيل، متتبعًا عدد المراجع القوية لكائن. عندما يصل العداد إلى الصفر، يتم تحرير الكائن فورًا.
المشكلة الرئيسية لـ ARC هي الدورات المرجعية (retain cycles). عندما يحتفظ كائنان بمراجع قوية لبعضهما البعض، لا يتم تحرير الذاكرة أبدًا. الحل هو المراجع الضعيفة weak (تصبح nil تلقائيًا عند التحرير) والمراجع غير المملوكة unowned (تضمن أن الكائن حي).
class ProfileViewController: UIViewController {
var onLogout: (() -> Void)?
func setupHandler() {
// [weak self] يمنع retain cycle
onLogout = { [weak self] in
guard let self else { return }
self.dismiss(animated: true)
}
}
}لمنع الدورات المرجعية في الإغلاقات، استخدم [weak self] مع guard let self = self else { return }. هذه القاعدة مهمة بشكل خاص في UIKit، حيث يحتفظ ViewController بمراجع قوية لخصائصه والإغلاقات داخل تلك الخصائص تشير إلى ViewController.
الأسئلة الشائعة
تدعم Swift Int وDouble وFloat وString وBool وArray وSet وDictionary والصفوف (tuples). الأنواع الرقمية لها حجم ثابت: Int8 وInt16 وInt32 وInt64 وUInt غير الموقعة. للعمل مع التواريخ يُستخدم Date من Foundation، وللبيانات — Data.
Optional هو enum بحالتين: .none (nil) و .some(Wrapped). تتطلب Swift فحصًا صريحًا لـ Optional عبر if let أو guard let أو ??، مما يلغي NullPointerException. السلاسل الاختيارية (?.) تسمح بالوصول الآمن إلى خصائص القيم الاختيارية المتداخلة.
Struct — نوع قيمة، يُنسخ عند التعيين، لا يدعم الوراثة، لا يتطلب ARC. Class — نوع مرجع، يُمرر بالمرجع، يدعم الوراثة ومزيلات التهيئة. توصي Apple باستخدام struct كنوع افتراضي.
ARC تحسب تلقائيًا المراجع القوية لكائنات الفئات. عندما يصل العداد إلى الصفر، يتم تحرير الذاكرة. لمنع الدورات المرجعية، استخدم weak (nil تلقائي) و unowned (عمر مضمون). لا ينطبق ARC على struct ولا enum.
البرمجة الموجهة بالبروتوكولات هي نهج يستخدم البروتوكولات مع الإضافات بدلاً من التسلسل الهرمي للفئات. يمكن للبروتوكولات أن تحتوي على تطبيقات افتراضية للطرق عبر protocol extensions. هذا يسمح بإعادة استخدام الكود دون وراثة، مع الحفاظ على المرونة وقابلية الاختبار.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.