ورقة Swift المرجعية
آخر تحديث
Hello World والأساسيات
Swift لا تحتاج إلى قالب نمطي على المستوى الأعلى - سطر واحد يعمل.
| العملية | الصياغة |
|---|---|
| طباعة سطر | print("Hello, World!") |
| الطباعة دون سطر جديد | print("Hi", terminator: "") |
| استيفاء السلاسل النصية | print("Hi \(name)") |
| تعليق | // this is a comment |
| تعليق متعدد الأسطر | /* ... */ |
| استيراد وحدة | import Foundation |
| تشغيل ملف | swift run أو swift main.swift |
المتغيرات (let / var) والأنواع
استخدم let للثوابت و var للقيم القابلة للتغيير؛ والأنواع تُستنتَج عادةً.
| العملية | الصياغة |
|---|---|
| ثابت | let age = 30 |
| متغير | var count = 0 |
| نوع صريح | let name: String = "Ada" |
| الأنواع الأساسية | Int, Double, String, Bool, Character |
| تحويل النوع | Double(i), String(n), Int("42") |
| صف (Tuple) | let pair = (1, "a") |
| اسم نوع مستعار | typealias ID = Int |
| فحص النوع | value is String, value as? String |
الاختياريات (Optionals)
الاختياريات تنمذج الغياب المحتمل لقيمة؛ فكّ تغليفها قبل الاستخدام.
| العملية | الصياغة |
|---|---|
| تعريف اختياري | var name: String? = nil |
| الربط الاختياري | if let n = name { ... } |
| فكّ التغليف بـ guard | guard let n = name else { return } |
| دمج null | let n = name ?? "default" |
| التسلسل الاختياري | user?.address?.city |
| فكّ التغليف القسري (غير آمن) | name! |
| مفكوك التغليف ضمنيًا | var name: String! |
| Map على اختياري | name.map { $0.count } |
السلاسل النصية
السلاسل النصية أنواع قيمة بدعم Unicode كامل.
| العملية | الصياغة |
|---|---|
| الطول | s.count |
| الأحرف الكبيرة / الصغيرة | s.uppercased(), s.lowercased() |
| الدمج | "foo" + "bar" |
| الاستيفاء | "Total: \(price)" |
| الاحتواء | s.contains("ell") |
| له بادئة / لاحقة | s.hasPrefix("he") |
| التقسيم | s.split(separator: ",") |
| الاستبدال | s.replacingOccurrences(of: "a", with: "b") |
| سلسلة نصية متعددة الأسطر | """ ... """ |
المجموعات (Array و Dictionary و Set)
ثلاثة أنواع مجموعات أساسية، جميعها أنواع قيمة.
| العملية | الصياغة |
|---|---|
| مصفوفة حرفية | var nums = [1, 2, 3] |
| الإلحاق | nums.append(4) |
| الوصول / العدّ | nums[0], nums.count |
| Map / filter | nums.map { $0 * 2 }, nums.filter { $0 > 1 } |
| قاموس حرفي | var ages = ["Ada": 30] |
| الوصول إلى قاموس | ages["Ada"] يُرجع اختياريًا |
| مجموعة حرفية | var ids: Set = [1, 2, 3] |
| الإدراج في مجموعة | ids.insert(4) |
| التكرار على قاموس | for (k, v) in ages { ... } |
التحكم في التدفق
الشروط لا تحتاج إلى أقواس؛ ويجب أن تكون switch شاملة.
| العملية | الصياغة |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| الشرطي الثلاثي | let r = x > 0 ? "pos" : "neg" |
| Switch | switch n { case 1: ...; default: ... } |
| Switch مع نطاق | case 1...5: ... |
| حلقة for-in | for i in 0..<10 { ... } |
| for-in على مصفوفة | for item in items { ... } |
| حلقة while | while x < 100 { ... } |
| Repeat-while | repeat { ... } while x < 100 |
| Break / continue | break, continue |
الدوال والإغلاقات
الدوال لها معاملات معنونة؛ والإغلاقات كتل كود مكتفية بذاتها.
| العملية | الصياغة |
|---|---|
| تعريف دالة | func add(a: Int, b: Int) -> Int { a + b } |
| تسمية خارجية | func greet(to name: String) { ... } |
| معامل افتراضي | func greet(name: String = "World") { ... } |
| معامل متغير الوسائط | func sum(_ nums: Int...) -> Int { ... } |
| إرجاعات متعددة (صف) | func bounds() -> (min: Int, max: Int) { ... } |
| تعبير إغلاق | let f = { (x: Int) -> Int in x * x } |
| إغلاق لاحق | nums.map { $0 * 2 } |
| وسائط مختصرة | { $0 + $1 } |
البُنى مقابل الأصناف
البُنى أنواع قيمة (تُنسخ)؛ والأصناف أنواع مرجع (مشتركة).
| العملية | الصياغة |
|---|---|
| تعريف بنية | struct Point { var x: Int; var y: Int } |
| تعريف صنف | class Person { var name: String } |
| مهيّئ الصنف | init(name: String) { self.name = name } |
| إنشاء نسخة | let p = Point(x: 1, y: 2) |
| دالة بنية معدِّلة (mutating) | mutating func move() { x += 1 } |
| دالة صنف | func greet() { ... } |
| الوراثة (للأصناف فقط) | class Student: Person { ... } |
| خاصية محسوبة | var area: Int { width * height } |
| عضو ساكن | static let shared = Manager() |
التعدادات (Enums)
التعدادات تجمع القيم المترابطة ويمكنها حمل بيانات مرتبطة.
| العملية | الصياغة |
|---|---|
| تعريف تعداد | enum Direction { case north, south } |
| استخدام حالة | let d = Direction.north |
| Switch على تعداد | switch d { case .north: ... } |
| القيم الخام | enum Status: Int { case ok = 200 } |
| الوصول إلى القيمة الخام | Status.ok.rawValue |
| التهيئة من قيمة خام | Status(rawValue: 200) |
| القيم المرتبطة | case result(Int, String) |
| دوال على التعدادات | func label() -> String { ... } |
صياغة Swift التي تستخدمها أكثر من غيرها، على صفحة واحدة. ورقة Swift المرجعية هذه هي مرجع سريع للّغة الأساسية - الثوابت والمتغيرات، والاختياريات، والسلاسل النصية، والمجموعات، والتحكم في التدفق، والدوال والإغلاقات، بالإضافة إلى البُنى والأصناف والتعدادات التي تبني بها تطبيقات iOS و macOS.
كل ما هنا هو Swift قياسية تُترجم بسلسلة الأدوات الرسمية. انسخ ما تحتاجه، أو جرّب كل مقطع برمجي مباشرة في playground الخاص بـ Swift - دون الحاجة إلى Xcode.
الأسئلة الشائعة حول ورقة Swift المرجعية
هل ورقة Swift المرجعية هذه مجانية؟
كيف أفكّ تغليف اختياري في Swift؟
nil، لذا تفكّ تغليفه قبل الاستخدام. والطرق الآمنة هي الربط الاختياري (if let n = name { ... })، و guard let في أعلى الدالة، وعامل دمج null (name ?? "default")، والتسلسل الاختياري (user?.name). أمّا فكّ التغليف القسري بـ name! فيعمل لكنه يتعطّل إذا كانت القيمة nil، لذا لا تلجأ إليه إلا عندما تكون متيقّنًا.ما الفرق بين البنية والصنف في Swift؟
struct نوع قيمة: إسنادها أو تمريرها يصنع نسخة، لذا لا تؤثر التغييرات في الأصل. أمّا الـ class فنوع مرجع: تتشارك النسخ النسخة (instance) نفسها، والأصناف وحدها تدعم الوراثة. وتوجيه Apple هو تفضيل البُنى افتراضيًا واستخدام صنف عندما تحتاج إلى حالة مشتركة قابلة للتغيير أو إلى الوراثة.