في هذا الجزء الثالث من هذه السلسلة، سوف تقوم بإنشاء برنامج سطر الأوامر بسيطة لتسجيل أسماء وأعمار الناس. 

على طول هذه السلسلة ، سوف يتم التعرف على بعض المفاهيم للسويفت مثل المصفوفات، الأجسام، وصفوف . هيا بنا نبدأ!

ملاحظة// هذا الجزء من السلسلة سوف تقوم بتطوير سطر الأوامر OS X للتطبيق لأنها هي واحدة من أبسط الطرق للبدء. لذلك، سوف تحتاج Xcode 6.1  لاستكمال هذا الجزء من البرنامج التعليمي. يرجى  التحقق من إصدار Xcode قبل المتابعة.

لنبدأ : افتح ال Xcode وقم بخلق playground file بالضغط على Get started with a playground : 

 

عين اسم لشخص ,  platform اختر ios , اضغط Next واخزن ال playground اينما تريد و احذف هذا الخط لنبدأ من لائحة بيضاء : 

Classes and Objects : الصفوف  class  هي مخطط يصف كيف يمكن لكائن(Objects)  أن يعمل وماذا يجب أن تفعل.  يحدد ما هي الأساليب يمكن أن تستخدم لمعالجة كائن وما يجب أن يكون خصائص الكائن .في هذا المشروع، سوف تخلق صف class  اسمهPerson  سوف تكون قادرة على خلق الأساليب في هذا الصف  وإعطائه الخصائص مثل الاسم والعمر حتى يمكن أن يحقق المرجو منه في البرنامج 

أولا، إضافة الاعلان عن  الصف : 

class Person  {
 
}

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

 

class Person {   var firstName = “” var lastName = “” var age = 0   }

بالإضافة إلى الخصائص،  الصفوف يمكن أن تمتلك الأساليب. الأساليب هي العمليات التي تفعل شيئا على الصفوف  –

على سبيل المثال، قد ترغب في إضافة وسيلة لطباعة المستخدم إلى الشاشة – في الواقع، عليك أن تفعل ذلك في وقت لاحق!

أولا، لهذا التطبيق أنت بحاجة إلى وسيلة ليطلب من المستخدم الحصول على معلومات. نسخ ولصق هذه السطور مباشرة بعد

المتغير  age :

func input() -> String {
  let keyboard = NSFileHandle.fileHandleWithStandardInput()
  let inputData = keyboard.availableData
  let rawString = NSString(data: inputData, encoding:NSUTF8StringEncoding)
  if let string = rawString {
    return string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
  } else {
    return "Invalid input"
  }
}

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

كتابة الطريقة (Method) الخاصة بك :

لهذا الصف ، أنت بحاجة لكتابة ثلاث طرق :

١- () changeFirstName  للسماح للمستخدم بتغيير اسمه

٢- ()enterInfo لمطالبة المستخدم لإدخال المعلومات الخاصة به 

٣- ()printInfo لطباعة المعلومات إلى وحدة التحكم 

دعنا نبدأ مع () changeFirstName هذه ال method سوف تأخذ قيمة وتعيين الاسم الأول للشخص إلى تلك القيمة

أول شيء كنت بحاجة الى الذهاب الى القيام به هو كتابة في رأسmethod   . ضع هذا تحت input()method ضمن الكلاس Person

func changeFirstName(newFirstName:String)  {
}

عظيم! أكملت مجرد خطوة أولى في كتابة method الخاص بك. الآن، تحتاج إلى معرفة ما يدور في method.  الان داخل الأقواس يخلق متغير يسمى newFirstName من نوع String سيكون لديك لتعيين الاسم الأول Person object الى  المتغير newFirstName الشكل لل 

method يجب ان يكون هكذا :

 

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

 التالية :

 

import UIKit
 
class Person  {
 
 var firstName = ""   
 var lastName = ""
 var age = 0
 
  func input() -> String {
  let keyboard = NSFileHandle.fileHandleWithStandardInput()
  let inputData = keyboard.availableData
  let rawString = NSString(data: inputData, encoding:NSUTF8StringEncoding)
  if let string = rawString {
  return string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
  } else {
  return "Invalid input"
    }
  }
 
  func changeFirstName(newFirstName:String) {
    firstName = newFirstName
  }
 
}

الآن دعونا نحاول الخروج من الصف!

باستخدام صفك لإنشاء مثيل للكلاس الخاص بك Person class النزول إلى أسفل ملف playground واستخدام السطر :

 

ما حصل للتو تم إنشاء object  كائن newPerson من نوع Person واعطائه قيمة Person الآن حاول إعداد خصائص 

person class بالشكل الاتي :

newPerson.firstName = "Ry"
newPerson.lastName = "Bristow"
newPerson.age = 18
إذا قمت بتحريك موشر الmouse على جهة اليمين وانقر على أيقونة العين بجانب السطر الأخير 
سترى أنه قد تم تحديث خصائص الكلاس بداخل newPerson object 

 

يمكنك استخدام الطريقة الجديدة  تكتب مثل هكذا :

newPerson.changeFirstName("Paul")

 على الجانب الأيمن من النافذة، وسترى أن القيم المرتبطة الكائن objectالخاص بك قد تغيرت لتشمل
 "Paul"  كقيمة مخزنة في الfirstName.
هذا أساسيات استخدام الكلاس

الآن عليك أن تعرف كيف الكتابة واستخدام أساليب الخاصة بك تعمل، دعنا ننتقل إلى الأساليب التي سوف تحتاج لمشروعك. وسوف يطلق اسم أول واحد ()enterInfo  تماما مثل قبل، فإن أول شيء عليك القيام به هو إنشاء رأس الأسلوب. إرسال هذا الرأس طريقة أقل من

()changeFirstName في class Person : 

func enterInfo()  {
 
}

الآن، دعونا نعمل على ترتيب body. للحصول على سماح للمستخدم أن يدخل في ما تريد منهم أن يدخلوا
 عليك أن نقول لهم ما تريد. دعونانستخدم print() statement لهذا الغرض :
print("What is the first name?")
يجب تعيين متغير firstName الى  ()input
firstName() = input
سوف تضيف المزيد إلى هذا الأسلوب(method) في وقت لاحق. الآن، دعونا ننتقل إلى()printInfo
الغرض من هذه الmethod  هو طباعة معلومات عن Person object ينبغي أن تبدو هكذا
func printInfo()  {
  print("First Name: \(firstName)")
}
تهانينا، لقد انتهيت من النماذج صفك! من الجميل أن النموذج الأولي أشياء في Playground
 مثل هذا عندما يكون ذلك ممكنا لأنه وسيلة سريعة وسهلة لتجربة أشياء جديدة قبل انشاء التطبيق
 الكامل. الصورة التالية توضح الكودات التي من المفترض انك كتبتها لغاية هذه النقطة : 

لآن دعونا نضع هذا لاستخدامها في أداة سطر الأوامر!

إنشاء الصف (class) مع ملف سويفت : 

افتح ال Xcode اذا لم يكن مفتوحا واضغط على الزر الذي يقول Create a new Xcode project  إذا قمت بإغلاقه من غير قصد

 “Welcome to Xcode”

window   أو بالفعل لديها مشروع Xcode project يمكنك إنشاء مشروع جديد من خلال الذهاب الى File واختر New > Project 

ثم في ال OS X section اختر Application ثم Command Line Tool واضغط Next

قم بملاء الفراغات اعلاه بي :

  • Product Name: PeopleDatabase
  • Organization Name: هذا الحقل يمكن تركه فارغا. أو يمكنك إدخال اسم شركتك.
  • Organization Identifier: ادخل com.yourname مثل com.bmoakley 
    • Language: Swift

الان اذهب الى File\New\File واختر OS X\Source\Swift File واضغط Next

 

سمي الفايل Person.swift و اضغط Create في داخل  Person.swift  انسخ Person class ك نموذج أولي في Playground الخاضة بك

يجب أن تبدو مثل هذا:

import Foundation
 
class Person  {
 
  var firstName = ""
  var lastName = ""
  var age = 0
 
  func input() -> String {
    let keyboard = NSFileHandle.fileHandleWithStandardInput()
    let inputData = keyboard.availableData
    let rawString = NSString(data: inputData, encoding:NSUTF8StringEncoding)
    if let string = rawString {
      return string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    } else {
      return "Invalid input"
    }
  }
 
  func changeFirstName(newFirstName:String) {
    firstName = newFirstName
  }
 
  func enterInfo()  {
    print("What is the first name?")
    firstName = input()
  }
 
  func printInfo()  {
    print("First Name: \(firstName)")
  }
 
}

 

قبل الانتقال للعمل في main.swift يجب  أن تنهي الmethods في Person class الخاص بك للقيام بذلك، سيكون لديك لإضافة المطالبات والبيانات مدخلات لاسم العائلة وعمر الشخص Person في ال enterInfo() method والقدرة على طباعة هذه  اثنين من المعلومات في

()method)  printInfo)  التالي يبين ال enterInfo() method كيف تبدو :

func enterInfo()  {
  print("What is the first name?")
  firstName = input()
  print("What is \(firstName)'s last name?")
  lastName = input()
  print("How old is \(firstName) \(lastName)")
  let userInput = Int(input())
  if let number = userInput {
    age = number
  }
}

 

تأكد من انك لا مجرد نسخ ولصق الرمز في كل مرة يتم توفير ذلك لك. تأخذ من الوقت للذهاب من خلال ودراسة أجزاء مختلفة منه. هذه هي الطريقة التي سوف تتعلم من خلالها . هذه الكتلة من التعليمات البرمجية لديها print()statement و بيان الدخل لكل من المتغيرات، ولكن واحدة ل age هو قليلا أكثر تعقيدا. لذا age هو من نوع int بدلا من String لذا فإنه يتطلب toInt() method ذا كان هذا يبدو مألوفا، فإن ذلك لأنك قد استخدمت من قبل! تذكر، هذا التحويل يتطلب استخدام if let statement حالة إدخال مدخلات التي لا يمكن تحويلها إلى Int. الان حاول تحديث printInfo() method محاولة للحصول على الناتج كان تقول  شيئا مثل :

John Smith is 30 years old
إذا واجهتك مشكلة، هنا هو الحل ا:
func printInfo()  {
  print("\(firstName) \(lastName) is \(age) years old")
}

إذا كنت ترغب في مضاعفة التحقق من عملك، وهنا هو Person.swift يجب يبدو الى غاية هذه النقطة  : 

 

اختبار صفك class : اضغط على main.swift في مشروع المستكشف واستبدال المحتويات بما يلي: 

import Foundation
()var newPerson = Person  
()newPerson.enterInfo
()newPerson.printInfo

الان اضغط run تنفيذ ومحاولة الخروج التطبيق الخاص بك!

 

مبروك تم اكمال صفك  class  الاول

The Repeat While Loop : لهذا القسم التالي، lنت بحاجة إلى دالة مساعد من البرنامج التعليمي السابق، لذلك قم ينسخ الكود الاتي الى مشروع ال xcode الخاص بك : 

سيكون من الجميل أن تسمح للمستخدم بإدخال أكثر من شخص واحد عند تشغيل التطبيق. للقيام بذلك، دعونا نحاول في حلقة جديدة.

وهذا يسمى repeat...while loop تستخدم لاستدعاء do while loop تم تسميتها في Swift 2.0 ال repeat while تختلف عن

while loop بسبب انها تنفذ مرة واحدة  قبل أن يتحقق من  الشرط لمعرفة في ما اذا كان يجب الاستمرار في التنفيذ .

اولا قم بخلق متغير من نوع string اسمه response مباشرتا اسفل import statement. 

var response: String

اسفل ذلك اعمل do...while loop

repeat  {
 
}  while(response == "y")

ثم قطع كل شيء أدناه ولصقه في داخل الحلقة. من أجل جعل هذا الأمر بحيثloop سوف تستمر ما دام يريد 
المستخدم، لديك لدفعهم إلى التساؤل عما إذا كانت ترغب في الاستمرار ووضعresponse الى تلك القيمة 
أدخل هذه الأسطر من التعليمات البرمجية قبل قوس الاغلاق ل do...while loop.

الان المستخدم سوف يخبر البرنامج بالاستمرار او عدم الاستمرار إما عن طريق ادخال y اذا كان نعم اوn اذا كان لا 

إذا كنت ترغب في مضاعفة التحقق من عملك، هنا هو ما main.swift يجب أن تبدو بعد هذا القسم 

افحص البرنامج الخاص بك بالضغط على  زر run حاول إدخال العديد من الأسماء عن طريق إدخال y في كل مرة ثم يخرج عن طريق إدخال n

 

Array المصفوفات : في كل مرة تذهب من خلال الحلقة  ال  loop   البرنامج ينسى تماما المعلومات التي تم معالجتها المصفوفات هي الأشياء التي يمكن تخزين كائنات أخرى في القائمة، وتسمح لك بالوصول إليها. تعلن عن طريق  سطور برمجية كما في السطر الاتي :

var response:String
var people: [Person] = []
قمت بإنشائه صفوفة تسمى people  الذي يقوم بتخزين الأشياء من نوع Person بواسطة وضع اسم الكلاس class داخل الاقواس [ ] 

المصفوفة التي قمت بنشاءها مجموعة فارغة لا تحتوي على أي شيء لإضافة كائن إلى المصفوفة ، يمكنك استخدام طريقة .()append

.دعونا نقوم  بهذه المحاولة. إدراج السطر التالي من التعليمات البرمجية بين () printInfo و () enterInfo تستدعا بواسطة الحلقة :

people.append(newPerson)

الان في كل مرة تقوم بخلق newPerson object قبل مطالبة المستخدم للحصول على معلومات يمكنك إضافة 
الكائن إلى المصفوفةprint() statements خارج الحلقة loop . :

print("Number of people in the database: \(people.count)")
وهذا السطر الأول يوفرالسماح للمستخدم معرفة عدد الاشخاص الذين دخلوا في قاعدة البيانات عن طريق 
عد كم عدد القطع المعروضة في المصفوفةpeople .
قم بتشغيلالتطبيق الخاص بك مرة أخرى، وأدخل اسمين. عند الانتهاء من ذلك، سوف نرى ما يلي:

 

    

,  

 

For Loopsهذه الحلقة هي وسيلة سهلة لتكرار  كافة العناصر في المصفوفة . هذا هو الكمال إذا كنت ترغب في طباعة قاعدة البيانات بأكملها من الناس في نهاية المطاف مثلا إذا كنت ترغب في طباعة قاعدة بيانات بأكملها من الناس في المصفوفة دعونا نحاول ذلك. إضافة هذه الأسطر إلى أسفل main.swift :

for onePerson in people  {
 
}

ما سوف تفعله الحلقة هو العمل من خلال مصفوفة people كائن واحد في وقت واحد. في كل مرة يذهب خلال الحلقة، سيتم تعيين الكائن في مؤشر المقبل ل onePerson حتى يمر بجكيعهم التالي إضافة هذا السطر إلى الكائن من الحلقة: 

()onePerson.printInfo
هذا السطر هو طباعة معلومات حول كل شخص Person object  في المصفوفةpeople بعد ان قام المستخدم 
بادخالهم جميعا عمل رائع! هنا هو ما النص الكامل الخاص بك main.swift ملف يجب أن تبدو بعد 
الانتهاء لهذه النقطة. إذا كان لديك مشكلة في مكان ما، ولا يمكن معرفة ذلك، استخدم هذا لمساعدتك :

الانتهاء من ذلك – هنا هو مثال على ما يجب أن يكون عليه الانتاج  بعد أن قمت بتشغيل تطبيقك :