✅ أولاً: ما هو enum؟
📘 التعريف:
enum (اختصار لـ enumeration) هو نوع بيانات مخصص يُستخدم لتعريف مجموعة من القيم الثابتة المحددة مسبقًا.
بدلاً من استخدام نصوص أو أرقام لتمثيل حالات معينة، نستخدم enum لجعل الكود أكثر وضوحًا وتنظيمًا.
✅ الشكل العام لتعريف enum:
enum EnumName {
value1,
value2,
value3,
}
Dart
✅ مثال 1: تمثيل أيام الأسبوع
enum WeekDay {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
void main() {
WeekDay today = WeekDay.Monday;
if (today == WeekDay.Monday) {
print("اليوم هو الإثنين");
}
}
Dart
✅ شرح المثال:
- أنشأنا
enum باسم WeekDay يحتوي على أيام الأسبوع.
- المتغير
today تم تعيينه إلى WeekDay.Monday.
- فحصنا إذا كان اليوم هو الإثنين، وطبعنا رسالة.
✅ لماذا نستخدم enum بدلًا من Strings أو Integers؟
| Strings/Integers | enums |
|---|
| معرض للخطأ الإملائي | محمي من الأخطاء |
| يصعب التحقق منه | سهل المقارنة |
| غير منظم | منظم ومقروء |
| لا يدعم الميزات المتقدمة | يدعم الوظائف والخصائص |
✅ مثال 2: حالة الطلب (Order Status)
enum OrderStatus {
pending,
processing,
shipped,
delivered,
canceled
}
void checkStatus(OrderStatus status) {
switch (status) {
case OrderStatus.pending:
print("طلبك قيد الانتظار");
break;
case OrderStatus.processing:
print("يتم تجهيز طلبك");
break;
case OrderStatus.shipped:
print("تم شحن طلبك");
break;
case OrderStatus.delivered:
print("تم توصيل طلبك");
break;
case OrderStatus.canceled:
print("تم إلغاء الطلب");
break;
}
}
void main() {
checkStatus(OrderStatus.processing); // يتم تجهيز طلبك
}
Dart
✅ أماكن وحالات الاستخدام
| الاستخدام | المثال |
|---|
| 🎮 حالات اللعبة | مثل: فوز، خسارة، انتظار، جاري اللعب |
| 📦 حالة الطلب | قيد المعالجة، تم الشحن، تم الإلغاء |
| 🚦 إشارات المرور | أحمر، أصفر، أخضر |
| 🔐 صلاحيات المستخدم | مدير، مشرف، مستخدم عادي |
| 🎧 مشغل الموسيقى | تشغيل، إيقاف، مؤقت |
| 📱 نوع الجهاز | Android، iOS، Web |
✅ خصائص متقدمة للـ enum (بدءًا من Dart 2.17)
1. استخدام الخصائص داخل enum:
enum Role {
admin,
moderator,
user;
bool get canDeleteUsers => this == Role.admin || this == Role.moderator;
}
Dart
void main() {
print(Role.admin.canDeleteUsers); // true
print(Role.user.canDeleteUsers); // false
}
Dart
2. إضافة قيم خاصة لكل عنصر:
enum Planet {
Mercury(3.303e+23, 2.4397e6),
Venus(4.869e+24, 6.0518e6),
Earth(5.976e+24, 6.37814e6);
final double mass;
final double radius;
const Planet(this.mass, this.radius);
double get surfaceGravity {
const G = 6.67300e-11;
return G * mass / (radius * radius);
}
}
void main() {
print(Planet.Earth.surfaceGravity); // 9.802652743337129
}
Dart
✅ كيف نطبع أسماء القيم؟
print(Role.admin.name); // admin>
Dart
✅ كيف نحصل على جميع القيم؟
for (var role in Role.values) {
print(role);
}
Dart
✅ تحويل String إلى enum (عكس .name):
Role fromString(String name) =>
Role.values.firstWhere((e) => e.name == name, orElse: () => Role.user);
void main() {
print(fromString("admin")); // Role.admin
}
Dart
✅ استخدام enum في switch داخل كلاس:
class User {
final String name;
final Role role;
User(this.name, this.role);
void printPermission() {
switch (role) {
case Role.admin:
print("له كل الصلاحيات");
break;
case Role.moderator:
print("له بعض الصلاحيات");
break;
case Role.user:
print("صلاحيات محدودة");
break;
}
}
}
Dart
✅ خلاصة شاملة:
| العنصر | الفائدة |
|---|
enum | ينظم القيم الثابتة |
name | إرجاع اسم القيمة كـ String |
values | إرجاع جميع القيم كـ List |
switch | تسهل المقارنة والتصرف حسب القيمة |
| الخصائص | يمكنك إلحاق خصائص ودوال بالقيم |