في  البرمجة بشكل عام المتغيرات Variabals والثوابت Constant موجودة بهدف ان تتيح لك تخزين البيانات لاعادة استخدامها مره اخرى في البرنامج. وعند تعريفك لمتغير جديد في البرنامج فانت ستقوم بربط اسم محدد مثل name او age بقيمة محددة من نوع محدد. 

تسمية المتغيرات

لديك كامل الحرية في تسمية المتغيرات ماعدا بعض القيود مثل التالية:

  • لا تبدآ برقم
  • لا تتضمن مسافات
  • لا تتضمن رموز عمليات رياضية
  • لا تستخدم الكلمات التي تستخدمها لغه سويفت كجزء منها

يجب آن تلتزم بافضل المممارسات في تسمية المتغيرات بحيث تضمن كتابة كود سهل القراءة والفهم، خاصة اذا كنت تعمل في فريق برمجي. اذا اردت اضافة متغير لتخزين اسم فستكون تسميته name مناسبه ومنطقيه اكثر من تسميته n فقط! ولو اردت كتابة اسم متغير بكلمات متعددة فاستخدم اسلوب camel case بحيث اول كلمه من الاسم المتعدد تكون بحروف صغيره ثم اول حرف يكون كبير لاي كلمه اخرى مثل userOneName.

إضافة المتغيرات والثوابت

عملية اضافة وتعريف المتغيرات والثواتب هي واحدة. اولاً يتم تحديد اما ثابت let او متغير var حسب الحالة، ثم اسم المتغير حتى يمكنك استدعائه به في البرنامج لاحقاً، ثم لديك الخيار اما ان تحدد قيمة للمتغير عند تعريفه اول مره كما في المثال التالي

var name = "robot"

او تترك المتغير فارغ بدون قيمة لتحددها في وقت اخر ولكن عليك حينها استخدام شيئ يدعى في سويفت type annotation وهو كتابة نوع البيانات التي تريد منحها لاحقاً للمتغير. كما في المثال التالي:

var name: String name = "robot"

بالطبع لا يفضل استخدام هذا الاسلوب الثاني اذا كنت ستقوم بكتابة البيانات مباشرة في السطر الثاني لتعريف اسم المتغير. دائما عند تعريف المتغير مع قيمته اكتب المتغير وقيمته في سطر واحد كما في المثال الاول، ولو اردت الحاق نوع المتغير قبل القيمة فلن تمنعك سويفت من ذلك ولكنه امر لا داعي له في معظم الاحوال.

var name: String = "robot"

الفرق بين المتغيرات والثوابت

الثوابت Constant في سويفت تكون باختصار let وتعني ان القيمة ستصبح ثابته للآبد ولا يمكنك تغييرها مرة اخرى. 

let name = “robot”

اما المتغيرات وتبداء باختصار var تسمح لك بتغيير قيمتها بقدر لا محدود.

var name = “robot”

حينما تحاول ان تغير قيمة الثابت فسوف تحصل على خطآ

let age = 22 age = 25

اما المتغيرات فسيكون متاح لها تغييرها بالقدر الذي تريد

let age = 22 age = 25 age += 2 print(age)

الكود السابق سيطبع 27 لان اخر سطر باضافة + قبل = يعني اضافة 2 على قيمة المتغير الذي بالسطر السابق ثم حفظ المجموع كقيمة للمتغير .

يمكنك ايضاً نسخ او منح قيمة اي متغير او ثابت معرف مسبقاً الى متغير جديد او اخر

let minAge = 18 var userOneAge = minAge

لماذا ومتى تستخدم متغير او ثابت؟

بالتآكيد يمكنك دوماً ادخال كل البيانات كمتغيرات var وان لا تتقيد باستخدام الثوابت let في برنامج٫ سويفت لن تجبرك بل ستسمح لك بذلك، ربما ستقترح عليك احياناً ان تغير بعض البيانات من متغير الى ثابت لانه سيكون من الافضل ذلك حسب طريقة سويفت في انجاز الامور. لكن كمبرمج فعال وخبير عليك ان تهتم باستخدام الثوابت والمتغيرات بنفسك حسب الحالة التي امامك وذلك لعدة اسباب اهمها:

  • امان اللغة، لنفرض لو كان في تخطيطك للحل البرمجي حددت ان تلك القيمة يجب ان تكون ثابته دائ٬ا وادخلتها كذلك في الكود ولكن لاحقاً نسيت وحاولت تغييرها فسوف ينبهك Xcode بالخطآ ولن يسمح لك ببناء البرنامج قبل اصلاحه.

  • المترجم الذي يفسر الكود الخاص بس من سويفت الى اللغه التي يفهمها الكمبيوتر سيعرف ان هذه القيمة يجب ان تكون ثابته في الذاكره دائما ويغلق احتمال العوده لتغييرها لاحقاً بالتالي هو يتعامل مع الثوابت بشكل مختلف عن المتغيرات وهذا يجعل لها معالجه مختلفه تنعكس على سرعه وفعالية اداء البرنامج

ولنفرض انك تريد عمل برنامج يستخدم GPS ويحسب المسافه من مدينة لاخرى فسوف تقوم بتمثيل البيانات الرذيسية كالتالي:

  • مكان الانطلاق: سيزودك به GPS مره احدة عن انطلاق الرحلة وسيظل كما هو طوال مسيره الرحلة ولن يتغير بالتالي ستقوم بتعريفه كثابت let

  • وجهة الرحلة: ايضاً سيتم تحديده في بداية الرحلة بواسطة GPS ولن يتم تغييره طوال مسيرة الرحلة بالتالي ستقوم بتعريفه كثابت let.

  • الموقع الحالي + المسافة المقطوعة + المسافة المتبقية: كل هذه البيانات ستتغير دائماً وبشكل فوري كلما تحركت بالتالي ستقوم بتعريف كل منها كمتغير var

انواع البيانات Type data

تملك سويفت كيغرها من لغات البرمجة العديد من انواع البيانات التي يمكن ان تحددها لكل متغير او ثابت تدخله في برنامجك. وعند تعريف انواع البيانات دائما يتم استخدام حرف كبير لاول الكلمة.

رآينا في الامثله السابقة نوعين من تلك البيانات المستعملة وهي البيانات النصية وتسمى في سويفت String تمثل الحروف او النصوص بشكل عام:

var name: String name = "robot"

والبيانات الرقمية وتسمى Int كاختصار ل integer وتمثل الارقام العادية 1234 الخ:

var age: Int age = 25

يوجد ايضاً Double وتمثل الارقام التي تملك فاصلة عشرية 1.0 2.0 3.0 4.0 الخ:

var longitude: Double longitude = -87.244556

والنوع الاخر هو للبيانات المنطقية التي تحتمل اجابة صح true او خطآ false فقط واختصارها Bool بمعنى Boolean:

var nothingNew: Bool nothingNew = true

يوجد أيضاً نوع اخر هو Character ويستخدم اذا اردت اضافة بيانات عبارة عن حرف واحد فقط:

var blood: Character blood = "A"

استنباط الانواع Type inference

سويفت تملك ميزة قوية مثل type inference التي تقوم باستنتاج نوع البيانات من المتغير حينما تدخل قيمته٬ بالتالي لا داعي لكتابة نوع البيانات الا اذا كنت ستعرف المتغير ولا تنوي ادخال قيمة في نفس السطر كما شرحنا سابقاً. 

مع type inference سيكون شكل الاكواد السابقة التي شرحنا بها انواع البيانات بالشكل الابسط والافضل كما يلي:

var name = "robot" var age = 25 var longitude = -87.244556 var nothingNew = true

كان هذا كل شيء هام كمقدمة عن المتيغرات والثوابت والبيانات في سويفت. اتمنى ان لا تتردد في مشاركتي بآي استفسار او تعليق على حسابي في تويتر كما اتطلع لانضمام المزيد من المتعلمين على قناة سلاك حتى نستمتع بالتعلم معاً.


------------------------------


# تحديث1: أحاول في مجموعة سلاك اعداد تمارين تفاعلية من اعدادي واضيف عليها تمارين كتاب Apple التعليمي حتى ترسخ الفهم للمبتدئين تماماً وسأضع هنا التمارين الخاصة بهذا المقال. بإمكانك ارسال الحل لنا في مجموعة سلاك اطلب دعوة من حسابي في تويتر.

قم بتعريف جميع المعلومات التالية في متغيرات او ثوابت  var/let حسب ما تتطلبه كل معلومه مع ضروره تعريف نوع كل متغير او ثابت تقوم بعمله حسب نوع البيانات اذا كانت نصية او رقمية او منطقية.   Name: Christopher Walken Age: 74 Birthplace: Astoria, New York, USA Residence: Wilton, Connecticut, USA Profession: Actor Years active: 1953–present Won Oscar: Yes Blood Type: A Weight: 75.62 Height: 181.3   -----------------------  اسئلة اضافية  // اي القيم التالية سيكون من الافضل تمثيلها كثابت؟ let  A. اسم اللاعب B. مستوى اللاعب C. درجة اللاعب D. موقع اللاعب  // أي القيم التالية سيكون من الافضل تمثيلها كمتغير؟ var  A. الاسم B. تاريخ الميلاد C. العمر D. عنوان المنزل  // اختار الجمل التي لا يمكن ان تكون سبباً صحيحاً لاستخدام الثابت let?  A. استخدام الثابت من الممارسات الجيدة التي يجب على المبرمج الالتزام بها للقيم الثابته التي لا تتغير B. المفسر يقدم معالجة مخصصة للبيانات الثابته تختلف عن المتغيرة C. لدعم أمان اللغة فالمبرمج لا يستطيع بالخطأ تغيير قيمة لا يجب ان تتغير في ذهنه حينما صمم الحل البرمجي D. معظم البيانات التي نتعامل معها لا تتغير   // باستخدام استنباط نوع البيانات التلقائي الذي تدعمه سويفت, اي من البيانات التالية ستكون من نوع Double?  A. var state = "California" B. let country = "USA" C. let population = 39250017 D. let speedLimit = 75.0  // هل الكود التالي سيعمل بشكل صحيح؟ ولماذا؟  let number: Double = 3  A. نعم لان المفسر سيمنح number القيمة 3.0 B. نعم لان 3 من نوع Double C. لا لأن 3 ليست من نوع Double