0Pricing
Swift Academy · درس

الفهارس الفرعية والامتدادات العامة

طبّق القيود على الفهارس الفرعية والامتدادات.

الفهارس الفرعية والامتدادات العامة درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

الرموز السفلية العامة

يمكن أن تكون الرموز السفلية عامة، بحيث تأخذ معلمات أنواعها الخاصة المستقلة عن النوع الحاوي. ويتيح ذلك لرمز سفلي واحد خدمة أنواع إدخال متعددة.

struct Lookup {
    let data = [1, 2, 3, 4, 5]
    subscript<S: Sequence>(indices idx: S) -> [Int] where S.Element == Int {
        idx.map { data[$0] }
    }
}
print(Lookup()[indices: [0, 2, 4]])

لماذا نستخدم الرموز السفلية العامة؟

يمكنكم تمرير Array أو Set أو Range من الفهارس إلى الرمز السفلي نفسه، لأنه يقبل أي Sequence من Int.

struct Lookup {
    let data = [10, 20, 30, 40]
    subscript<S: Sequence>(_ idx: S) -> [Int] where S.Element == Int {
        idx.map { data[$0] }
    }
}
let l = Lookup()
print(l[0...1])
print(l[[3, 0]])

الامتدادات المقيّدة

يضيف extension ... where أعضاءً لا توجد إلا عند تحقق القيد. ولا تظهر هذه الأعضاء في النوع إلا مع المعلمات العامة المطابقة.

extension Array where Element: Numeric {
    func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())

امتداد لنوع عنصر محدد

استخدموا where Element == String لإضافة أدوات مساعدة خاصة بـ String إلى مصفوفات السلاسل النصية فقط.

extension Array where Element == String {
    func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())

امتداد مقيّد ببروتوكول

أضيفوا سلوكًا عندما تتوافق العناصر مع بروتوكول مخصص.

protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Collection where Element: Priced {
    var total: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 2), Item(price: 3)].total)

رمز سفلي عام يعيد قيمة اختيارية

يمكن أن يكون الرمز السفلي عامًا وأن يعيد قيمة اختيارية، مثل الفهرسة الآمنة داخل مجموعة.

extension Array {
    subscript(safe i: Int) -> Element? {
        indices.contains(i) ? self[i] : nil
    }
}
print([1, 2, 3][safe: 1] ?? -1)
print([1, 2, 3][safe: 9] ?? -1)

رمز سفلي عام في القاموس

يمكن للرموز السفلية العامة قبول تسلسل من المفاتيح وإعادة القيم المطابقة.

extension Dictionary {
    subscript<S: Sequence>(keys ks: S) -> [Value] where S.Element == Key {
        ks.compactMap { self[$0] }
    }
}
let d = ["a": 1, "b": 2, "c": 3]
print(d[keys: ["a", "c"]].sorted())

الدمج مع where على Self

يمكن لامتدادات الأنواع العامة تقييد النوع المغلّف، مما يتيح واجهات برمجة تطبيقات مخصصة.

struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
    var peakMax: T? { items.max() }
}
var s = Stack<Int>(); s.items = [3, 9, 1]
print(s.peakMax!)

رمز سفلي عام بمعلمات متعددة

يمكن للرمز السفلي أن يأخذ عدة وسائط ومعلمات أنواعه الخاصة معًا.

struct Grid {
    let rows = [[1, 2], [3, 4]]
    subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])

للقراءة فقط مقابل القراءة والكتابة

مثل الخصائص، يمكن أن تحتوي الرموز السفلية على get فقط، أو على كل من get وset لإجراء التغيير.

struct Pad {
    var values = [0, 0, 0]
    subscript(i: Int) -> Int {
        get { values[i] }
        set { values[i] = newValue }
    }
}
var p = Pad(); p[1] = 7
print(p.values)

جمع العناصر معًا

تتيح الرموز السفلية العامة، إلى جانب الامتدادات المقيّدة، بناء واجهات برمجة تطبيقات معبّرة وآمنة من حيث النوع تتكيف مع أي أنواع عناصر أو وسائط مستخدمة.

extension Array where Element: Comparable {
    subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])

اختبار سريع

اختبروا مدى فهمكم للرموز السفلية العامة والامتدادات المقيّدة.

مراجعة

تعرّف الرموز السفلية العامة معلمات أنواعها وجمل where الخاصة بها، مما يتيح لرمز سفلي واحد قبول أنواع إدخال متعددة. وتضيف الامتدادات المقيّدة (where Element: ... أو == ...) أعضاءً فقط عند تحقق الشروط. ويتيح الجمع بينهما بناء واجهات برمجة تطبيقات آمنة من حيث النوع وقابلة للتكيف.

الأسئلة الشائعة

هل درس «الفهارس الفرعية والامتدادات العامة» مجاني؟

نعم — نص درس «الفهارس الفرعية والامتدادات العامة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «الفهارس الفرعية والامتدادات العامة»؟

طبّق القيود على الفهارس الفرعية والامتدادات. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الفهارس الفرعية والامتدادات العامة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. قيود معلمات النوع
  2. عبارات where في الدوال
  3. تقييد الأنواع المرتبطة
  4. الفهارس الفرعية والامتدادات العامة
← العودة إلى Swift Academy