مساحة اعلانية

آخر المواضيع

تعلم Swift من الصفر: المجموعات و الحقول الفارغة

تعلم Swift من الصفر: المجموعات و الحقول الفارغة
تعلم Swift من الصفر: المجموعات و الحقول الفارغة

في الدرس السابق, تعلمت عن المتغيرات, الثوابت و بعض الأنواع الشائعة للبيانات مثل الأرقام, الطفو و النصوص. في هذا الدرس, سنركز على المجموعات. تعرف مكتبة Swift المعيارية نوعين للمجموعات, المصفوفات و القواميس. دعونا نبدأ بالمصفوفات.

1. المصفوفات
اذا كنت على معرفة بـ Objective-C , JavaScript أوPHP, حينها لن تجد صعوبة باستيعاب مفهوم المصفوفات. تعد المصفوفة مجموعة من القيم المنظمة و التي رقمها التسلسلي صفر.  و لكن هناك بضعة اختلافات.

النوع
أول اختلاف في المصفوفات في Objective-C هو أن القيم المخزنة في مصفوفة ما تكون من نفس النوع دائما. في بادئ الأمر, يمكن أن يبدو هذا تقييدا كبيرا, و لكنه في الحقيقة ليس كذلك. في الواقع, لدى هذا التقييد ميزة مهمة. اننا نعلم بالضبط ما النوع الذي سنحصل عليه عندما نطلب من المصفوفة احدى قيمها.

و هناك اختلاف اساسي اخر مع مصفوفات Objective-C و هو نوع القيم الذي يمكن للمصفوفة ان تخزنه.  في Objective-C, يمكن للمصفوفة ان تخزن قيم فقط من نوع الصنف. ليس لدى Swift هذا التقييد. يمكن للمصفوفة في Swift أن تخزن نصوص, أرقام, و الطفو بالاضافة الى نماذج الصنف. كيف يعمل ذلك و لماذا يعد ممكننا في Swift سيصبح ذلك واضحا لاحقا في هذه السلسلة عندما نغطي فقرة الأصناف و البنى.

الاعلان

بينما يتم انشاء مصفوفة من خلال عدة طرق, يجب أن تتذكر أن Swift سيحتاج أن يعلم أي نوع من القيم تخطط أن تخزن في هذه المصفوفة. أنشئ ملعبا جديدا في Xcode كما فعلت في الدرس السابق و أضف الأسطر التالية الى ملعبك.

   


var array1: Array<String>
var array2: [String]
var array3 = ["Apple", "Pear", "Orange"]



يعد السطر الثاني اختزالا للثاني. تخبر الأقواس المربعة التي تلف الكلمة الاساسية String Swift أننا نعلن عن مصفوفة يمكن أن تحوي فقط كائنات String.

يمكنك قرأة السطر الأول من الكود كـ "نعلن عن متغير يدعى  array1 من نوع Array التي يمكن أن تحوي فقط على كائنات String". لاحظ أنني قمت بكتابة من نوع بالخط المائل بما ان هذا ما تشير اليه النقطتان.

يعرض السطر الثالث لنا كيفية بدء مصفوفة باستخدام أحرف المصفوفة. تبدو أحرف المصفوفة مشابهة جدا لتلك التي في Objective-C. يكمن الاختلاف الوحيد في غياب الرمز@  الذي يسبق الاقواس المربعة و أحرف النص.

هنالك أيضا طريقة رائعة لبدء مصفوفة من خلال عدد معرف مسبقا من القيم الافتراضية. يمكن أن تكون تركيبة الكود مربكة بعض الشيء, ولكن خذ عدة دقائق لاستيعابها.
   

var a = [String](count: 5, repeatedValue: "Test")

تحوي المصفوفة الناتجة على خمسة نصوص, و كل نص يساوي "Test". من أجل فهم عملية البدء في الاعلى بشكل أفضل, الق نظرة على سطري الكود التاليين حيث قمنا ببدء مصفوفة فارغة من النصوص.
 


var b = Array<String>()
var c = [String]()

لا تقلق في حال ما زلت مشوشا. سنستطلع تركيبة الكود بتفاصيل أكثر حالما نبدأ بمناقشة الأصناف و الدوال. في هذا الدرس, يقع تركيزنا فقط على المجموعات.

التغيرية

احدى ميزات Swift التي ستقدرها بسرعة هي كيفية الاعلان عن مجموعات متغيرة. على سبيل المثال, يعلن مقطع الكود الذي في الاعلى عن ثلاث مصفوفات متغيرة.  تعرف المصفوفة المتغيرة من خلال استخدام الكلمة الاساسية  var. انها بتلك البساطة. في حال لم ترغب أن تكون المصفوفة متغيرة, فاستخدم الكلمة الاساسية let  بدلا من ذلك. يهدف Swift لأن يكون بديهيا و سهل الاستخدام, و لذا يعد انشاء المتغيرات في Swift مثالا جيدا لهذا الهدف.

الحصول على القيم و تعيينها
من أجل الولوج الى قيم مخزنة في مصفوفة, سنستخدم نفس تركيبة الكود المكتوبة في Objective-C. في المثال التالي, سنطلب من array3 عنصرها الثاني, النص "pear".

array3[1]

يعد استبدال القيمة المخزنة بالرقم التسلسلي 1 بسيطا كتعيين قيمة جديدة باستخدام نفس تركيبة الكود المكتوبة. في المثال التالي, سنستبدل "pear" ذات الرقم التسلسلي 1 بـ "peach".

array3[1] = "Peach"

يعد ذلك ممكنا فقط لان المصفوفة متغيرة, أي أننا استخدمنا الكلمة الاساسية var  لكي نعلن عن مصفوفة. لا يعد تغيير مصفوفة ثابت ممكنا. هنالك تقنيات متقدمة أكثر لتغيير محتوى مصفوفة, و لكن المفهوم الاساسي نفسى لا يتغير.

يعد دمج مصفوفتان بسيطا كاضافة بعضهما للاخر. في المثال التالي, سنعلن عن و ندمج مصفوفتين متغيرتين. لاحظ أن المصفوفة الناتجة, c, لا تحتاج الى أن تكون متغيرة لكي يعمل هذا.
    


let a = [1, 2, 3]
let b = [4, 5, 6]


let c = a + b

و مع ذلك, فمن الاساسي أن تكون القيم المخزنة في a و b من نفس النوع. يجب ان يكون السبب واضحا الان. تحتاج أن تكون القيم المخزنة في مصفوفة ما أن تكون من نفس النوع. سينتج عن المثال التالي خطأ ما.

   


let a = [1, 2, 3]
let b = [1.5, 5.2, 6.3]
let c = a + b

من أجل فتح مصفوفة على مصفوفة متغيرة, سنستخدم العامل  +=. لاحظ أن operand على الطرف الايمن هو عبارة عن مصفوفة. لن تعمل هذه العملية اذا لم تزل الأقواس المربعة المحيطة بـ 4.

var a = [1, 2, 3]
a += [4]

العمليات

تعد المصفوفات كائنات يمكن أن تطبق عليها عمليات كثيرة. تعرض المصفوفة عددا من الدوال أو الطرق. من أجل استدعاء طريقة لكائن, يجب أن تستخدم الرمز نقطة. أضف السطر التالي الى ملعبك من أجل اضافة المادة لـ array3.   

array3.append("Cherry")

دعونا نرى كم عدد المواد التي تحويها array3 من خلال استدعاء طريقتها count. هذا يعطي 4 في لائحة النتائج على الطرف الايمن.

array3.count

من الممكن أيضا ادخال مادة الى رقم تسلسلي محدد من  خلال استدعاء طريقة المصفوفة insert كما هو موضح بالاسفل. تقبل طريقة insert أكثر من معاملة واحدة و يمكن أن تبدو غريبة بعض الشيء في بادئ الأمر.

array3.insert("Prune", atIndex: 2)

كما هو الحال في  Objective-C, فان Swift يدعم المعاملات المسماة من أجل تحسين القراءة. و ينتج عن ذلك أن الكود تصبح أسهل للقراءة و الفهم و لا تحتاج الدوال أو الطرق شرحا كثيرا بالنسبة لما يمكنهم فعله. من الواضح, على سبيل المثال, أن طريقة  insert تدخل عنصر بالرقم التسلسلي 2.

بينما يعد Swift أكثر اختصارا و أقلا من حيث عدد الكلمات من Objective-C, فانه يدعم المعاملات المسماة. اذا كنت تعرفObjective-C , JavaScript أوPHP, حينها ستستغرق بعض الوقت لتعتاد على ذلك.

الطرق المريحة
ما أستمتع به حقا في Swift هو الخصائص و الطرق المريحة الشبيهة بتلك الموجودة في Ruby. فعلى سبيل المثال, لدى المصفوفة خاصية isEmpty التي تخبرك في حال كانت المصفوفة تحوي على أية عناصر. هذا ليس سوى طريقة مختزلة لفحص خاصية مصفوفة count. و لكن النتيجة هي كود أكثر اختصارا و اسهل قراءة.

array3.isEmpty

2. القواميس
تتصرف القواميس بطريقة مشابهة للقواميس في Objective-C. يخزن القاموس مجموعة غير منظمة من القيم. ترتبط كل قيمة في القاموس بمفتاح. بكلمات أخرى, يخزن القاموس عددا من ازواج القيم/المفاتيح.

النوع

كما هو الحال في المصفوفات, فان المفاتيح و القيم المخزنة في القاموس تحتاج الى ان تكون من نفس النوع. هذا يعني أنك اذا طلبت من القاموس ان يعطيك قيمة لمفتاح معين, ستعرف النوع الذي سيعيده القاموس.

الاعلان

يشبه الاعلان  عن قاموس الاعلان عن مصفوفة. يكمن الاختلاف في أننا نحتاج الى أن نحدد نوع كلا المفاتيح و القيم. يوضح المثال التالي ثلاث طرق للاعلان عن قاموس.

   


var dictionary1: Dictionary<String, Int>
var dictionary2: [String: Int]
var dictionary3 = ["Apple": 3, "Pear": 8, "Orange": 11]

يعد السطر الثاني اختزالا للسطر الأول. تحتاج مفاتيح هذه القواميس الى أن تكون من String بينما يتوقع أن تكون القيم من نوع Int. تشير الكلمة الاساسية  var الى أن القواميس متغيرة.

يمكنك قراءة السطر الأول من الكود كـ "نعلن عن متغير يدعي dictionary1  من نوع Dictionary  يمكنه أن يحوي على مفاتيح من نوع String و قيم من نوع Int."

يوضح السطر الثالث كيفية بدء القاموس باستخدام أحرف القاموس. يشبه ذلك تركيبة الكود التي نستخدمها في Objective-C, و لكن لاحظ أن الاقواس المعوجة قد استبدلت بأقواس مربعة و أن الاحرف ليست مسبوقة بالرمز@.

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


let value = dictionary3["Apple"]
println(value)

ستلاحظ أن Xcode سيخبرنا أن قيمة value هي ليست 3, و انما Optional(3). ماذا يعني ذلك؟  يستخدم Swift الاختيارات للف القيم التي يمكن ظان تكون واحدة من شيئين, قيمة أو صفر (nil). لا تقلق حيال الاختيارات في هذه المرحلة. سنركز على الاختيارات في الدرس القادم من هذه السلسلة. دعوني فقط أخبركم أن الاختيارات هي مفهوم أساسي اخر من مفاهيم لغة البرمجة Swift.

من المهم أن نشير الى أن تركيبة الكود للولوج الى قيمة قاموس مطابقة تماما لتلك في المصفوفات في حال كانت مفاتيح القاموس من نوع Int. ألق نظرة على المثال التالي لترى ما الذي أعنيه.


var dictionary4 = [0: "Apple", 1: "Pear", 2: "Orange"]
let fruit = dictionary4[0]

العمليات

كما هو الحال في المصفوفات, فان مكتبة Swift تعرف سلسلة واسعة من العمليات التي يمكن تطبيقها على القواميس. يعدو القاموس بعدد من أزواج القيم/المفاتيح من خلال استدعاء count عليها. يعد ازالة زوج القيم/المفاتيح سهلا و بديهيا كما هو موضح في المثال التالي. بالطبع, هذا ممكن فقط اذا كان القاموس متغيرا.

dictionary4.removeValueForKey(0)

عندما تبدأ بتعلم Swift, فانك ستصادف مقاطع كود غريبة و مربكة بين الفينة و الاخرى. ألق نظرة على السطر التالي حيث أعلنا أولا عم قاموس و من ثم أزلنا أزواج القيم/المفاتيح التابعة له.

   


var dictionary = [String: Int]()


dictionary["Oranges"] = 2
dictionary["Apples"] = 10
dictionary["Pears"] = 5


dictionary = [:]

يجب أن تعترف أن السطر الاخير يبدو غريبا بعض الشيء. لان Swift يعلم انواع المفاتيح و القيم التي يمكن أن تخزن في dictionary, فان افراغ القاموس يعد سهلا كتعيين قاموس فارغ له.

ليس هنالك حاجة لتعيين أنواع للمفاتيح و القيم في هذه الحالة, ذلك لأننا قمنا مسبقا بفعل ذلك عندما أعلانا عن القاموس في السطر الاول. يشر ذلك الى تفصيل مهم اخر, و هو أن نوع القيم التي يمكنك تخزينها في المصفوفات و القواميس لا يمكن أ ن تتغير حالما يتم استدعاء المجموعة.

3. الحقول الفارغة
سوف تحب الحقول الفارغة . بينما لا تعد الحقول الفارغة مجموعات, فانهم أيضا يجمعون قيم متعددة. و بطرقة مشابهة للمصفوفات و القواميس, فان الحقول الفارغة يمكن أن تحوي على قيم  لأي نوع. و لكن الاختلاف الوحيد هو أن القيم المخزنة في الحقل الفارغ لا تحتاج لان تكون من نفس النوع. الق نظرة على المثال لشرح ذلك بتفصيل أكثر.
   


var currency = ("EUR", 0.81)
var time = (NSDate(), "This is my message.")
var email = ("Bart Jacobs", "bart@example.com")

يعلن المثال الاول عن حقل فارغ يدعى currency من نوع (String, Int). يحوي الحقل الفارغ الثاني, time, على النموذج NSDate و أحرف النص.  تنتمي كلا القيم المخزنة في email الى نوع String, مما يعني أن email هي من نوع (String, String).

الوصول الى القيم

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

من أجل الولوج الى قيمة مخزنة في حقل فارغ, يجب ان تستخدم الرقم التسلسلي الذي يتوافق مع القيمة التي تهتم بها. 
   

var rate = currency.1
var message = time.1
var name = email.0

يعرض Xcode لنا الارقام التسلسلية لكل قيمة مخزنة في الحقل الفارغ في لوحة النتائج في الملعب من جهة اليمين.

الاسماء

من أجل تحسين القراءة, يمكنك أن تسمي القيم المخزنة في الحقل الفارغ. بالنتيجة يمكنك الولوج الى قيم الحقل الفارغ من خلال اسمائهم بدلا من رقمهم التسلسلي. يختلف الاعلان عن حقل فارغ قليلا في تلك الحالة.
  


var currency = (name: "EUR", rate: 0.81)
let currencyName = currency.name
let currencyRate = currency.rate

التفكيك

هنالك طريقة ثانية أفضل للعمل مع القيم المخزنة في حقل فارغ. ألق نظرة على المثال التالي حيث قمنا بتفكيك محتوى currency.

let (currencyName, currencyRate) = currency
تخزن قيمة currency ذات الرقم التسلسلي 0 في currencyName و تخزن القيمة ذات الرقم التسلسلي 1 في currencyRate. ليس هنالك داع لتحديد نوع لـ currencyName و currencyRate بما أن Swift سيستنتج النوع من القيم المخزنة في currency. بكلمات أخرى, فان currencyName تنتمي الى نوع String و currencyRate الى Float.

في حال كنت مهتما فقط بقيم محددة من الحقل الفارغ, يمكنك أن تستخدم underscore من أجل اخبار Swift عن القيم التي لا تريدها.


let (currencyName, _) = currency


الخلاصة

تعد المصفوفات و القواميس من المحتويات الاساسية تقريبا  لكا لغات البرمجة و بذلك فان Swift ليس استثناء. في حين أن المجموعات تتصرف بطرقة مختلفة قليلا في Swift, فانك لن تستغرق طويلا حتى تتعرف على أنواع المجموعات في Swift اذا عملت مع المصفوفات و القواميس في لغات برمجة أخرى. في الدرس التالي, سنستطلع الاختيارات و التحكم بالتدفق.

الكــاتــب

    • مشاركة

ليست هناك تعليقات:

جميع الحقوق محفوظة لــ الشبح للمعلوميات 2019 ©