Ahmad Salman

Projects // @a7mads


Swift: Optionals

من المبادئ المهمة في Swfit هو جعل اللغة آمنة، هذا يعني محاولة تجنب الأخطاء قدر الإمكان، وكذلك محاولة إيجاد الأخطاء في Compile Time وليس Run Time. أي عندما تقوم ببناء التطبيق وليس أثناء استخدامه.

الأنواع الاختيارية (Optionals) تختلف بأن الهدف منها هو التعبير عن امكانية وجود قيمة أو امكانية عدم وجود قيمة. يمكن التعبير عن حالة الأنواع الإختيارية بطريقتين “هناك قيمة، والقيمة هي x” أو “لا يوجد قيمة على الإطلاق”.

كمثال، احدى خصائص النوع String هي دالة toInt، هذه الدالة تحاول تحويل النص إلى Int. لكن بالطبع ليس كل نص يمكن تحويله لعدد. النص "123" يمكن تحويله إلى القيمة العددية 123. لكن نص مثل "hello, world" لا يمكن تحويله.

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()

في المثال أعلاه، الثابت convertedNumber ليس من نوع Int كما قد تظن، هو في الواقع من نوع Int? ويعني Optional Int. نرمز للأنواع الاختيارية (Optionals) باضافة علامة استفهام ? إلى اسم النوع.

لماذا Optionals؟

من خصائص Swift أنها Type-Safe Language فهي لن تسمح لك يتعيين قيمة تختلف عن النوع المُعرّف، سواء لمتغير أو ثابت أو عنصر لدالة أو ناتج لدالة.

في مثال الدالة toInt، في بعض الأحيان لن تتمكن من تحويل النص إلى قيمة عددية، ماذا ستكون النتيجة المُعادة من الدالة في تلك الحالة؟ قد نقترح 0 ولكن صفر نتيجة صحيحة للنص "0"، كذلك هو الحال للعدد -1 أو أي عدد في الواقع. ولأن النوع Int فلا يمكننا استخدام غير الأعداد الصحيحة. هنا تتضح فائدة Optionals، بامكان استخدام القيمة الخاصة nil مع Optionals للعتبير عن عدم وجود قيمة.

Forced Unwrapping

بامكانك تخيل أن Optionals تكوّن طبقة تغلف المتغير أو الثابت لتُعلمك قبل استخدامه بوجود قيمة من عدمها. استخدم if مع المتغير أو الثابت من نوع Optional لتفحص وجود القيمة. اذا كان له قيمة ستكون النتيجة true، وان لم يكن له قيمة ستكون النتيجة false.

في حال تأكدت من وجود قيمة، استخدم علامة التعجب ! في نهاية اسم المتغير أو الثابت لكشف القيمة. استخدام علامة التعجب هو كقولك: “أعرف أن لهذا المتغير قيمة، فضلا استخدمها”. هذا يسمى Forced Unwrapping.

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()

if convertedNumber {
    println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}
// prints "123 has an integer value of 123"

Optional Binding

تستخدم Optionals كثيرًا في Swift، لذلك هناك طريقة أسهل لاستخراج قيمها وهي Optional Binding. تستخدم هذه الطريقة لفحص اذا كان Optional يحمل قيمة، وفي حال كان يحمل قيمة، تعين القيمة لثابت أو متغير مؤقت. كلها في تعبير واحد. يمكنك استخدام Optional Binding مع if و while.

تكتب Optional Binding مع if كالتالي:

 if let <constantName> = <someOptional> {
    <statements>
}

يمكننا كتابة مثال possibleNumber السابق باستخدام Optional Binding بدلًا من Forced Unwrapping كالتالي:

if let actualNumber = possibleNumber.toInt() {
    println("\(possibleNumber) has an integer value of \(actualNumber)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}
// prints "123 has an integer value of 123"

بامكانك قراءتها: “اذا كان Optional Int المعاد من possibleNumber.toInt يحتوي على قيمة، عرف ثابت جديد اسمه actualNumber واجعل قيمته هي القيمة الموجودة في Optional”.

اذا نجح التحويل، الثابت actualNumber يصبح متوفرًا في الفرع الأول للعبارة الشرطية if. يكون معرفًا ويحمل القيمة الموجودة في Optional، ولا داعي لاستخدام علامة التعجب ! لاستخراج قيمته. كما في المثال، نستخدم actualNumber مباشرة لطباعة القيمة المحوّلة.

يمكنك استخدام متغير عوضًا عن ثابت اذا احتجت للتحكم بقيمة actualNumber. ببساطة اكتب if var actualNumber.

nil

تعين حالة عدم وجود قيمة لمتغير من نوع Optional باستخدام القيمة الخاصة nil

var serverResponseCode: Int? = 404
// serverResponseCode يتحتوي على قيمة 404
serverResponseCode = nil
// serverResponseCode لا يحتوي على قيمة

لا يمكن استخدام nil مع غير Optionals. اذا كنت بحاجة للتعبير عن عدم وجود قيمة لمتغير أو ثابت في حالات معينة، عرفه دئمًا على أنه نوع اختياري (Optional).

هذه التدوينة هي جزء من سلسلة تدوينات عن لغة البرمجة Swift

Jun 24, 2014

Swift: الأساسيات

توفر Swift أنواع قيم أساسية خاصة بها لكل الأنواع الموجودة في C و Objective-C. النوع Int لتعريف Integers؛ النوعين Double و Float لتعريف Floating-point values؛ النوع String لتعريف Strings؛ النوع Bool لتعريف Booleans. توفر كذلك نوعين من المجموعات الأساسية، هما Arrays وDictionaries.

بالإضافة للأنواع المألوفة، توفر Swift أنواع متقدمة مثل Tuples، هذا النوع يعطيك القدرة على التعامل مع مجموعة من القيم مرة واحدة. يمكن مثلًا إعادة مجموعة من القيم من دالة كقيمة مركبة.

المتغيرات والثوابت

المتغيرات والثوابت تعطي اسمًا لكل قيمة من نوع محدد. استخدم let لتعريف ثابت (Constant) و var لتعريف متغير (Variable). ليس بالضرورة أن يكون للثابت قيمة في Compile Time، لكن يجب تعيين قيمتة مرة واحدة فقط. هذا يعني أن تستخدم الثوابت لتعريف القيم المحسوبة مرة واحدة لكن مستخدمة عدة مرات.

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

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

محاولة تغيير قيمة ثابت ينتج عنها خطأ

let languageName = "Swift"
languageName = "Swift++"
// خطأ في وقت الترجمة compile-time error

لتعريف أكثر من متغير أو ثابت دفعة واحدة، ضعها في سطر واحد وبينها فاصلة ,.

var x = 0.0, y = 0.0, z = 0.0

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

let π = 3.14159
let اللغة = "Arabic"
let 🐶🐮 = "dogcow"

نوع الثابت أو المتغير يجب أن يطابق نوع القيمة التي تريد تعيينها له. لست بحاجة لكتابة النوع دومًا. تعيين قيمة في وقت التعريف يعطي Compiler القدرة على استنتاج النوع (Type inference). يستنتج المترجم أن نوع الثابت meaningOfLife هو Int لأن القيمة الأولية له 42 هي من نوع Int.

let meaningOfLife = 42

اذا كانت القيمة الأولية لا توفر معلومات كافية (أو ليس هناك قيمة أولية)، بامكانك تحديد النوع بكتابة نقطتين رأسيتين متبوعة بمسافة ثم النوع بعد اسم المتغير أو الثابت. يمكنك قراءة النقطتين الرأسيتين على أنها “… من نوع …”. المتغير welcomeMessage من نوع String.

var welcomeMessage: String

بمجرد تعريف مثغير أو ثابت لا يمكن تعريفه مجددًا بنفس الاسم، أو تغيير نوعه. ولا يمكنك إعادة تعريف ثابت لمتغير أو العكس.

لا يتم تحويل نوع القيم تلقائيًا. اذا أردت تحويل النوع عليك فعل ذلك بشكل صريح.

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi تساوي 3.14159، ويستنتج أنها من نوع Double

الأعداد

الأعداد الصحيحة -بدون فواصل العشرية- (Integers) سواء موجبة، سالبة، أو صفر تكون من نوع Int.
لأعداد الفاصلة العائمة -تحتوي على فاصلة عشرية- سواء موجبة أو سالبة استخدم النوع Double للأعداد الكبيرة جدًا أو التي تتطلب دقة عالية، و Float للأعداد التي لا تتطلب دقة أكثر من ٦ خانات عشرية.

Booleans

لتعريف متغير أو ثابت Boolean استخدم النوع Bool. تستخدم Swift القيمتين true و false كقيم منطقية.

let orangesAreOrange = true
var turnipsAreDelicious = false

Strings

يمكنك تعريف ثابت أو متغير من نوع String بقيمة مباشرة باستخدام String literals، وهي أي نص بين علامتي تنصيص "".

let someString = "Some string literal value

بإمكانك إدراج القيم في النصوص بسهولة، Swift تدعم توليد النص (String interpolation). اكتب القيمة داخل قوسين وأسبقها بشرطة مائلة \.

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

Tuples

هي مجموعة من القيم في قيمة واحدة مُركبة. القيم داخل Tuple يمكن أن تكون من أنواع مختلفة. في المثال أدناه (404, "Not Found") هو Tuple من نوع (Int, String)

let http404Error = (404, "Not Found")

let (statusCode, statusMessage) = http404Error

statusCode // 404
statusMessage // "Not Found"

طباعة المتغيرات والثوابت

استخدم الدالة println لطباعة واستعراض قيمة أي متغير أو ثابت

var name = "Ahmad"
println("Hello, \(name)!")
// تطبع Hello, Ahmad!

هذه التدوينة هي جزء من سلسلة تدوينات عن لغة البرمجة Swift

Jun 10, 2014

Swift

Swift هي لغة البرمجة الجديدة من Apple لتطوير تطبيقات iOS و OS X، تبني على أفضل الأجزاء من C و Objective-C. تتبنى Swift أنماط البرمجة الآمنة وتشجع على أفضل الممارسات بهدف جعل البرمجة أسهل، أكثر مرونة، وأكثر متعة. Swift هي صفحة جديدة، مدعومة بالأطر المعروفة Cocoa و Cocoa Touch.

وكما ينص التقليد، أول برنامج بأي لغة يجب أن يطبع “Hello, world” على الشاشة. في Swift بامكانك فعل ذلك ببساطة في سطر واحد:

println("Hello, world")

اذا استخدمت C أو حتى Objective-C من قبل سيبدوا السطر أعلاه مألوفًا لديك. في Swift هذا السطر فقط برنامج كامل. لست بحاجة لإدراج مكتبة افتراضية لخصائص الإدخال والأخراج أو للتعامل مع النص. المصدر يكتب في النطاق العام (global scope) ويستخدم كنقطة دخول، لست بحاجة لدالة رئيسية (main function). ولست بحاجة كذلك لاستخدام فاصلة منقوطة في نهاية كل سطر.

هذه السلسلة من التدوينات ستعطيك معلومات كافية للبدء باستخدام Swift، وهي مبنية على ترجمة بتصرف لأجزاء من كتاب The Swift Programming Language المقدم مجانًا من Apple.

التدوينات

Jun 10, 2014

ما هو iBeacon؟

Alt text

من فترة لأخرى أفتن بتقنية وأشعر أن لها دور كبير في المستقبل وهذا ما حدث مع iBeacon.
iBeacon هو Protocol يتعمد على Bluetooth low energy من تطوير Apple يقوم على تنسيق الاكتشاف بين طرفين:

المعلن

الجهاز المعلن يبث حوله حقل ليعلن عن وجوده. هذا سبب تسميته beacon - تعني منارة. كل ما يبث المعلن هو هويتة المكونة من ثلاثة أجزاء ولا يستقبل شيئًا. يمكن أن يكون الجهاز المعلن أي جهاز يدعم تقنية BLE أي أنه يمكن أن يكون جهاز محمول أو دائرة إلكترونية بحجم زر.

الماسح

يقوم الجهاز الماسح، في الغالب جهاز محمول، بالبحث عن الأجهزة المعلنة - beacons، يستقبل فقط ولا يرسل. عندما يجد أي معلن يستقبل منه هويته المكونة من ثلاث أجزاء وقوة البث ليتمكن من حساب المسافة التقريبية بين الجهازين. يأتي هنا دور المطور للاستفادة من تلك المعلومات. بامكانه مطابقة هوية المعلن لقاعدة بيانات مجمعة مسبقًا ليعرف أنه عند beacon موضوعة في المكتبة على سبيل المثال.

لماذا iBeacon؟

ما يثير حماسي في iBeacon أنها طريقة سهلة لصنع تجرية لا تعتمد على الموقع فقط، ولكن على السياق أيضًا - Context-Aware Experience. في السابق باستخدام GPS فقط أفضل دقة يمكن أن تحصل عليها لمكان المستخدم هي 8 متر تقريبًا، هذا في أفضل الحالات. وإذا كنت داخل مبنى فلك أن تنسى استخدام GPS كليًا. المختلف في iBeacon أن الموقع المحدد، بعكس GPS، يمكن أن يكون دقيقًا لعدة سانتيمترات! ولبعد حتى ٥٠ متر تقريبًا. ولأن لكل beacon هوية مخصصة له بامكانك معرفة بعد جهاز المستخدم عن أي beacon بالتحديد وحتى دقة بضع سانتيمترات. بالاضافة إلى ذلك BLE يستهلك قدر قليل جدًا من الطاقة، بإمكان beacon أن تعمل لمدة سنتين ببطارية بحجم زر. ولا يحتاج beacon لأي اتصال خارجي بأنترنت أو غيره وتكلفته قليلة نسبيًا.

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

تحديث: شاركني بندر رفة مقطع فديو يعرض المزيد من الأمثلة لاستخدامات iBeacon.

Apr 26, 2014

ابحث عن البجعة السوداء

في الفديو أعلاه يقوم ديريك من القناة الرائعة Veritasium بطرح سؤال يبدو بسيطًا في البداية على مجموعة من الناس. >سوف أعطيك ثلاثة أرقام تتبع القانونًا معينا، عليك محاولة إيجاد القانون. ستفعل ذلك باقتراح مجموعة من الأرقام التي تعتقد أنها تتبع القانون، وسأجيبك بنعم ان كانت تتبعه ولا ان لم تكن. حسنًا الأرقام هي 2، 4، 8. ليس عليك إكمال المتسلسلة بإمكانك اقتراح أي مجموعة من الأرقام.

الكل تقريبًا يبدأ بإكمال متسلسلة قوى 2. الأرقام 16، 32، 64. نعم هي تتبع القانون، ولكن القانون ليس قوى 2. يبدأون بعد ذلك بمحاولة استنتاج أنماط للوصول لأرقام تتبع القانون، كلها دومًا تتبع القانون، ولكن النمط الذي استنتجوه ليس بالقانون!

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

وكذلك في الفديو، كان الكل يبحث عن “نعم”، عن مايوافق افتراضهم. وهو ما حصلوا عليه، الكثير من “نعم” التي لم تساعدهم. اقتراحات مثل 3، 6، 12 و 20، 40، 80 وحتى 500، 1000، 2000 كلها توافق القانون، لكن لم تفدهم في معرفة ماهو القانون. الطريقة الأسهل كانت بالبحث عن “لا”، عن ما يخالف القانون. بمجرد أن اقترح أحدهم 10، 9، 8 وكانت الأجابة لا عرف أن القانون هو أي مجموعة أرقام متصاعدة!

Mar 10, 2014