ما هو الـ Optional !?

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

ربما تكون قد صادفت خلال عملك او تجاربك مع اكثر اللغات ما يسمى بـ Null او nil او ما يرادفها حسب اللغة .. !

المهم ! لنبدأ بالمتغيرات ..

let name = "Saleh" // Saleh  
var blog = "Saleh.im" //  Saleh.im  
blog = "http://" + blog // http://Saleh.im  

هذا ما تعودنا عليه في عملية تعريف المتغيرات سواء باستخدام let او var ولكن ما ذا لو قمنا بالتالي !ّ

blog = nil // error !  

المشكلة التي وقعنا فيها هو ان المتغير الذي قمنا بتعريفه منذ البداية لا يقبل قيمة nil اي يجب ان يحتوي هذا المتغير على قيمة ذات معنى ولا يمكن ان يحتوى على قيمة nil

طيب ! قد يتسائل أحدهم بالسؤال التالي .. أريد أن أقوم بإنشاء متغير يحتوي على قيم معينه وفي لحظة ما أريده أن يحتوى على قيمة nil ؟

الأمر بسيط يا صديقي و جواب سؤالك في الأسفل ..

var updateDate : String? = nil  // nil  
updateDate  = "2016-12-10T12:56:47+00:00"  

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

اصبر قليلاً ودعني أشرح بعض الأمور لك .. عندما يكون لديك متغير قد تم تعريفه بهذه الطريقة يسمى هذا المتغير بـ optional

var updateDate : String? = nil  // nil  

وله حالتان من التعامل عند التعامل مع هذه المتغير : - إما أن يحتوي على قيمة وبإمكانك التعامل معها بشكل مباشر - أو انه لا يحتوي على قيمة وانما يحتوي nil

بإمكاننا تلخيص الفكرة بالأعلى كما في الصورة بالشكل التالي :

فبالنظر إلى تعريفنا بالشكل var name: String? فإنه من الممكن إسناد قيمة إلى هذا المتغير أو من الممكن أن يكون nil

فلو أحببنا الاستعلام أو التعامل مع قيمة متغير من نوع optional يجب علينا التأكد من أن هذا المتعغير يحتوي على قيمة بالأصل أو يحتوي قيمة nil ..

"سأتحدث في تدوينة منفصلة عن عملية الاستعلام عن المتغير إما إن كان يحتوي على قيمة أو لا"

وبطبيعة الحال من الممكن تنفيذ مفهوم الـ Optional على مستوى الدالة "function" او الكائن "object"

func maxNumber(values: [Int]) -> Int? {  
    if values.isEmpty == true {
        return nil
    }
    return values.max()
}

مثال على التعامل مع الـ Object :

struct Student {  
    var id : Int!
    var name: String!
}
var student1 : Student? = nil  
student1 = Student(id: 1, name: "Saleh")  

مرجع ستفيدك كثير بعملية التعامل مع الـ optional :

للإستفسار والسؤال حسابي في تويتر : @SalehAlDhobaie

وبس,