تخطَّ إلى المحتوى

🦅 شرح Swift

الفهرسة المخصّصة (Subscripts)

الدرس 26 من 29· ⏱ 1 دقائق قراءة

ما هو الـ Subscript؟

اختصار للوصول إلى عناصر مجموعة أو تسلسل باستخدام [] — نفس الصياغة التي تستخدمها مع Array و Dictionary أصلًا، لكن يمكنك تعريفها على أنواعك الخاصة:

struct Grid {
    var values = Array(repeating: 0, count: 9)   // شبكة 3×3

    subscript(row: Int, column: Int) -> Int {
        get {
            return values[row * 3 + column]
        }
        set(newValue) {
            values[row * 3 + column] = newValue
        }
    }
}

var grid = Grid()
grid[0, 1] = 5
print(grid[0, 1])   // 5

subscript للقراءة فقط

إذا حذفت set، يصبح الـ subscript للقراءة فقط ويمكنك حذف كلمة get وأقواسها أيضًا:

struct Squares {
    subscript(n: Int) -> Int {
        return n * n
    }
}

let squares = Squares()
print(squares[4])   // 16

أكثر من معامل، وتحميل زائد

يقبل الـ subscript أي عدد من المعاملات وبأي نوع، ويمكن تعريف أكثر من نسخة (Swift يختار المناسبة حسب المعاملات):

struct Matrix {
    subscript(row: Int, col: Int) -> Double { /* ... */ 0 }
    subscript(index: String) -> Double { /* ... */ 0 }
}

💡 لا يمكن استخدام معاملات inout، لكن يمكن إعطاؤها قيمًا افتراضية مثل أي دالة عادية.

subscript على النوع نفسه (static)

يُستدعى على النوع مباشرة لا على نسخة منه، بإضافة static (أو class داخل صنف للسماح بالتجاوز):

enum Planet: Int {
    case mercury = 1, venus, earth, mars

    static subscript(n: Int) -> Planet {
        return Planet(rawValue: n)!
    }
}

let earth = Planet[3]   // يُستدعى على النوع Planet مباشرة

🎯 التالي: البرمجة غير المتزامنة (async/await).

شرح الفهرسة المخصّصة (Subscripts) — Swift بالعربي
الفهرسة المخصّصة (Subscripts)Swift بالعربي · The Code Fix

📚 لمزيد من التعمّق في Swift، راجِع كتاب Swift الرسمي.

هل كان هذا الدرس مفيدًا؟