المتغيرات وأنواع البيانات في Kotlin
في الدرس الأول ألقيت نظرة سريعة على val و var. الآن سنتعمق في المتغيرات وأنواع البيانات في Kotlin، لأنها الأساس الذي يقوم عليه كل تطبيق أندرويد ستكتبه. وستكتشف ميزة تجعل Kotlin محبوبة جداً: حمايتك من أخطاء القيم الفارغة.
val و var
Section titled “val و var”fun main() { val name = "سارة" var points = 10 points = points + 5 println("$name لديها $points نقطة")}سارة لديها 15 نقطةval(من value): قيمة لا يمكن إعادة إسنادها بعد تعريفها. مثل اسمك في شهادة الميلاد.var(من variable): متغير يمكن تغيير قيمته. مثل رصيد نقاطك في لعبة.
لو كتبت name = "منى" سيرفض المترجم الكود قبل التشغيل بخطأ 'val' cannot be reassigned.
الأنواع الأساسية
Section titled “الأنواع الأساسية”Kotlin لغة ثابتة الأنواع: لكل متغير نوع محدد لا يتغير. يمكنك كتابة النوع صراحة بعد نقطتين:
val city: String = "القاهرة"val students: Int = 30val price: Double = 12.5val isOpen: Boolean = trueval grade: Char = 'A'| النوع | يخزن | مثال |
|---|---|---|
Int |
أعداد صحيحة | 30 |
Long |
أعداد صحيحة كبيرة جداً | 7_000_000_000 |
Double |
أعداد عشرية | 12.5 |
Boolean |
صح أو خطأ | true و false |
Char |
حرف واحد بين علامتين مفردتين | 'A' |
String |
نص بين علامتين مزدوجتين | "مرحباً" |
لاحظ أن كل الأنواع تبدأ بحرف كبير. والشرطة السفلية في 7_000_000_000 لتسهيل القراءة فقط، ولا تغيّر القيمة.
استنتاج النوع
Section titled “استنتاج النوع”في الأغلب لا تحتاج كتابة النوع، لأن Kotlin تستنتجه من القيمة: val price = 12.5 تعرف وحدها أنه Double. لكن بعد الاستنتاج، النوع ثابت: لا تستطيع أن تضع نصاً في متغير من نوع Int.
العمليات الحسابية
Section titled “العمليات الحسابية”println(10 / 4)println(10.0 / 4)println(10 % 4)22.52انتبه للسطر الأول: قسمة عددين صحيحين تعطي عدداً صحيحاً، ويُحذف الكسر. إذا أردت النتيجة العشرية، اجعل أحد الطرفين عشرياً مثل 10.0. والعامل % يعطي باقي القسمة.
قوالب النصوص
Section titled “قوالب النصوص”لوضع قيمة متغير داخل نص، استخدم $، وللتعبيرات استخدم ${...}:
val first = "أحمد"println("طول الاسم: ${first.length}")println("بعد المكافأة: ${points + 3}")طول الاسم: 4بعد المكافأة: 18هذه الميزة اسمها قوالب النصوص (String Templates)، وهي أوضح بكثير من دمج النصوص بعلامة +.
التحويل بين الأنواع
Section titled “التحويل بين الأنواع”Kotlin لا تحوّل الأنواع تلقائياً، بل تطلب منك التحويل صراحة:
val input = "25"val n = input.toInt()println(n + 5)println("2.5".toDouble() * 2)println(42.toString() + "!")println("abc".toIntOrNull())305.042!nulltoInt()وtoDouble(): من نص إلى رقم. إذا لم يكن النص رقماً، يتوقف البرنامج بخطأ.toIntOrNull(): النسخة الآمنة، تُرجعnullبدلاً من الخطأ.toString(): من أي قيمة إلى نص.
الأمان من null
Section titled “الأمان من null”null تعني «لا قيمة». وفي Kotlin، المتغير العادي لا يقبل null أبداً. إذا كانت القيمة قد تكون غير موجودة، أضف ? بعد النوع:
var nickname: String? = nullprintln(nickname?.length)println(nickname ?: "لا يوجد")nickname = "سوسو"println(nickname?.length)nullلا يوجد4String?: نص أو null.?.(الوصول الآمن): «إذا كانت القيمة موجودة أعطني طولها، وإلا أعطني null بهدوء».?:(يسمى معامل إلفيس Elvis): «إذا كانت null، فاستخدم هذه القيمة البديلة».
هذه الميزة تمنع واحداً من أشهر أسباب انهيار تطبيقات أندرويد القديمة المكتوبة بـ Java، وهو خطأ NullPointerException.
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب برنامجاً لفاتورة صغيرة:
fun main() { val productName = "سماعة" val unitPrice = 150.0 val quantity = 2 val total = unitPrice * quantity
println("المنتج: $productName") println("الإجمالي: $total جنيه")}المنتج: سماعةالإجمالي: 300.0 جنيهتحدٍّ: أضف متغيراً لكود الخصم من نوع String? قيمته null، واطبع «لا يوجد خصم» باستخدام ?:.
أخطاء شائعة
Section titled “أخطاء شائعة”- إعادة إسناد val: خطأ
'val' cannot be reassigned. استخدمvarإذا كانت القيمة تتغير فعلاً. - نسيان التحويل:
"25" + 5تعطي النص"255"وليس 30! حوّل أولاً بـtoInt(). - قسمة الأعداد الصحيحة:
7 / 2تعطي 3 وليس 3.5. استخدم7.0 / 2.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج println(9 / 2) في Kotlin؟
قسمة عددين صحيحين تعطي عدداً صحيحاً ويُحذف الكسر. للحصول على 4.5 اكتب 9.0 / 2.
سؤال
ماذا يطبع val city: String? = null; println(city ?: "غير محدد")؟
معامل إلفيس ?: يُرجع القيمة البديلة عندما تكون القيمة على يساره null.
الخلاصة
Section titled “الخلاصة”valلقيمة لا يُعاد إسنادها، وvarلمتغير يتغير، وفضّلvalدائماً.- الأنواع الأساسية:
IntوLongوDoubleوBooleanوCharوString. - Kotlin تستنتج النوع، لكنه يبقى ثابتاً بعد ذلك.
$nameو${...}لقوالب النصوص، وtoInt()وtoIntOrNull()للتحويل.String?يقبل null، و?.للوصول الآمن، و?:للقيمة البديلة.