أحمد الشمري


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 11, 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

Leash

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

أردت أن يعمل التطبيق بدون تسجيل، بدون تنصيب برامج أو إضافات، وعلى أي جهاز أو متصفح. الفكرة في Leash -وهي ليست فكرة جديدة- أن عنوان الموقع Leash.co هو واجة الاستخدام، هو ما تستخدمه للتفاعل مع الموقع، URL as UI.

كان هناك قرارين مثيرين للإهتمام. الأول نطاق الموقع. العنوان هو ما سيتفاعل معه المستخدم، لهذا يجب أن يكون قصيرًا ليقلل كمية الكتابة، لكن في نفس الوقت يجب أن يكون سهل الحفظ. وجدت نطاقات من ثلاثة أحرف، لكن لم يكن لها أي معنى. اخترت Leash، بالإضافة للشعار "Take a website for a walk" لجعل الاسم أسهل للتذكر. الثاني تحديد فترة حياة للعناوين. أي عنوان يحفظ يحذف تلقائيًا بعد فترة. الهدف منه هو التوضيح للمستخدم أن هذه ليست خدمة لحفظ الروابط، وإنما لنقلها. ولتجنب تحول الموقع لخدمة تقصير روابط.

ذكرني Leash بسهولة إطلاق مشاريع الويب في الوقت الحالي. كتبته باستخدام Node.js، ولقاعدة البيانات استخدمت Redis، كلها تطبيقات مفتوحة المصدر. للاستضافة Heroku، يمكنك البدء معهم مجانًا وكل ما يتطلبه الأمر لنشر التطبيق طباعة git push.

Jan 01, 2014