subscript
الفهرسة المخصّصة subscript
subscript يتيح تعريف صياغة myValue[index] الخاصة بك على أي نوع، بنفس أسلوب Array و Dictionary المدمجين.
يُعرَّف subscript بجسم يشبه الخاصية المحسوبة: get لإرجاع قيمة، وset اختياري لتمكين الكتابة أيضًا. يقبل أي عدد ونوع من المعاملات (بلا inout)، ويمكن تعريف أكثر من نسخة يختار Swift بينها حسب نوع المعامل الممرّر.
يمكن أيضًا تعريف subscript على النوع نفسه (وليس نسخة منه) بإضافة static.
الصياغة
subscript(index: Type) -> ReturnType {
get { /* إرجاع قيمة */ }
set(newValue) { /* تعيين قيمة */ }
}📄 مثال
struct Grid {
var values = Array(repeating: 0, count: 9)
subscript(row: Int, col: Int) -> Int {
get { values[row * 3 + col] }
set { values[row * 3 + col] = newValue }
}
}
var grid = Grid()
grid[0, 1] = 5أهم النقاط
| العنصر | الوظيفة |
|---|---|
| get | إلزامي — يحدّد القيمة المُرجَعة عند القراءة |
| set(newValue) | اختياري — يفعّل الكتابة عبر []; بدونه القراءة فقط |
| static subscript | يُستدعى على النوع نفسه لا على نسخة منه |
💡 نصائح عملية
- إن كنت لا تحتاج set، احذفه واحذف get مع أقواسه ليصبح subscript للقراءة فقط
- عرّف أكثر من subscript بمعاملات مختلفة (Int مقابل String مثلًا) ليختار Swift المناسب تلقائيًا
⚠️ أخطاء شائعة
- محاولة استخدام معامل inout داخل subscript — غير مسموح بالكامل
- نسيان أن اسم معامل setter الافتراضي هو newValue إن لم تسمّه صراحةً
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار SWIFT الكامل بالعربي.