Swift 30

  • تنفيذ تبديل الطرق في Swift 3.0

    تنفيذ تبديل الطرق في لغة Swift 3.0 قد يتطلب بعض التعديلات بناءً على التغييرات التي طرأت على اللغة والمكتبة القياسية مع كل إصدار جديد. يبدو أن الكود الذي تمت مشاركته يستخدم نوعًا غير مدعوم في Swift 3.0، وهو dispatch_once_t. في الإصدارات الحديثة من Swift، تمت إزالة هذا النوع واقترح الاستخدام البديل للمتغيرات المُبادلة بالطريقة الكسلية (lazily initialized globals) بدلاً منه.

    للتكيف مع هذه التغييرات وتنفيذ تبديل الطرق بنجاح في Swift 3.0، يمكنك استخدام نمط التأخير في تهيئة المتغيرات العامة. يمكنك تحقيق هذا عن طريق استخدام إغلاقات (closures) والتي تسمح بتأجيل تنفيذ الكود حتى يتم الوصول إلى المتغير لأول مرة.

    فيما يلي كيف يمكنك تعديل الكود ليتوافق مع Swift 3.0:

    swift
    struct Swizzler { static var token: Int = 0 } extension NSObject { class func swizzleMethod(selector: Selector, withSelector newSelector: Selector) { let originalMethod = class_getInstanceMethod(self, selector) let swizzledMethod = class_getInstanceMethod(self, newSelector) guard let original = originalMethod, let swizzled = swizzledMethod else { return } let didAddMethod = class_addMethod(self, selector, method_getImplementation(swizzled), method_getTypeEncoding(swizzled)) if didAddMethod { class_replaceMethod(self, newSelector, method_getImplementation(original), method_getTypeEncoding(original)) } else { method_exchangeImplementations(original, swizzled) } } }

    بهذا التعديل، يتم استخدام متغير عام Swizzler.token بدلاً من dispatch_once_t. وتم استبدال استخدام dispatch_once_t بنمط التأخير في تهيئة المتغيرات العامة، مما يضمن أن يتم تهيئة المتغير مرة واحدة فقط وفي الوقت الذي يتم فيه الوصول إليه لأول مرة.

    بعد هذه التعديلات، يجب أن يعمل تبديل الطرق بنجاح في مشروع Swift 3.0 دون وجود أي أخطاء تتعلق بالأنواع غير المدعومة. وبالطبع، يجب التحقق من توافق هذا الكود مع متطلبات مشروعك واستخدامه بحذر، خاصة عند التعامل مع تبديل الطرق الخاصة بالـ framework أو الـ library الخارجية.

    المزيد من المعلومات

    بالتأكيد، إليك المزيد من المعلومات لإكمال المقال حول تنفيذ تبديل الطرق في Swift 3.0:

    تبديل الطرق (Method Swizzling) هو تقنية متقدمة في بيئة Objective-C حيث يمكن للمطورين استبدال تنفيذ الطرق (methods) في الوقت الفعلي. هذه التقنية تسمح بالتلاعب بسلوك الكلاسات والكائنات دون الحاجة إلى تغيير الكود الأصلي، وهي تستخدم في الغالب لأغراض الاختبار وتصحيح الأخطاء والتحسينات الأخرى.

    في Swift، لا تدعم التبديل المباشر للطرق كما في Objective-C. ولكن يمكن تحقيق نفس الغرض باستخدام ميزات اللغة المتقدمة مثل الإغلاقات والتمديدات (extensions). الكود الذي تم توفيره يوضح كيف يمكن استخدام تمديدات (extensions) لتعديل سلوك كلاس معين.

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

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

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

  • تجنب تداخل الأسماء في Swift 3.0

    في لغة البرمجة C#، عند استيراد مكتبة تحتوي على العديد من تداخلات الأسماء مع الشيفرة الموجودة بالفعل، هناك طريقة لتسمية الاستيراد بشكل بديل بحيث لا يلزمك توضيح النطاق الرئيسي لكل استخدام. على سبيل المثال، يمكنك استخدام:

    csharp
    using MyCompany.MyLibrary.Model as MMM

    ثم يمكنك القيام بالتالي:

    csharp
    MMM.MyObject

    بدلاً من:

    csharp
    MyCompany.MyLibrary.Model.MyObject

    مع التحديث الأخير لـ Swift 3.0، وجدت أن بعض كائنات النموذج الخاصة بي الآن تتعارض مع أنواع Foundation، وتم تضطر إلى إضافة بادئة “NS” لاسم الصف في السابق مع “Foundation.classname”. من الرائع إذا كنت يمكنني تسمية استيراد مكتبة النموذج الخاصة بي بطريقة مماثلة للمثال في C#. هل هذا ممكن في Swift 3.0؟ وإذا لم يكن كذلك، هل هناك استراتيجية أخرى لتجنب تداخل الأسماء التي ستؤدي إلى كتابة اسم الإطار أمام كل نوع؟ أنا أفكر في العودة إلى إضافة بادئات لأسماء الصفوف كما فعلنا في Objective-C، ولكن أحاول استكشاف خياراتي قبل ذلك.

    المزيد من المعلومات

    بالتأكيد، لنستكمل مناقشة هذا الموضوع.

    في Swift 3.0، لا يوجد مفهوم مباشر لتسمية الاستيراد كما في C#، ولكن هناك بدائل لتجنب تداخل الأسماء.

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

    على سبيل المثال:

    swift
    // تعريف نطاق النموذج الخاص بك enum MyModel { struct MyObject { // تعريف الخصائص والأساليب هنا } }

    ثم يمكنك استخدامه كالتالي:

    swift
    let myObject = MyModel.MyObject()

    هذا النهج يسمح لك بتجنب التداخلات دون الحاجة إلى كتابة اسم الإطار (Framework) أمام كل نوع.

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

    علاوة على ذلك، يمكنك استخدام المسميات المعقولة للمتغيرات والوظائف والأنواع لتجنب التداخلات. على سبيل المثال، بدلاً من استخدام “Data” كنوع، يمكنك استخدام “MyAppData” للإشارة إلى بيانات التطبيق الخاص بك.

    أخيرًا، قد يكون من المفيد أيضًا النظر في تنظيم الشفرة بشكل أفضل وتجنب تكرار الأسماء بشكل كبير، مما يقلل من فرص التداخل. يمكنك فصل الأجزاء المختلفة من التطبيق إلى مكتبات منفصلة والتي تستخدم مسميات متميزة.

    باختصار، على الرغم من عدم وجود مفهوم مباشر لتسمية الاستيراد في Swift 3.0 مثلما هو الحال في C#، إلا أن هناك العديد من الاستراتيجيات التي يمكن اتباعها لتجنب تداخل الأسماء وتسهيل قراءة الشفرة. باختيار الاستراتيجية المناسبة، يمكنك تحسين تنظيم وفهم الشفرة الخاصة بك وتجنب المشاكل المحتملة المتعلقة بالتداخلات في الأسماء.

  • تحديث استخدام Map في Swift 3.0 لتعديل مصفوفة الكائنات

    في Swift 3.0، تمت إزالة إمكانية استخدام الكلمة المفتاحية var داخل إغلاقات الـ map والحلقات الجديدة بشكل كامل، مما يعني أنه يجب عليك التعامل مع العناصر كـ constants. لذا، لتعديل قيم عناصر مصفوفة داخل إغلاق الـ map في Swift 3.0، يجب عليك استخدام نوع البيانات القابلة للتعديل (Mutable)، مثل الـ inout في متغير الإغلاق.

    في سياق استفسارك، إذا كان لديك مصفوفة من الكائنات من نوع Gnome وترغب في تعديل الخصائص في كل كائن داخل إغلاق map، يمكنك فعل ذلك بشكل مشابه للكود التالي:

    swift
    gnomes = gnomes.map { (gnome: inout Gnome) -> Gnome in gnome.age = 140 return gnome }

    ملاحظة أننا استخدمنا inout للإشارة إلى أن المتغير يمكن تعديله داخل الإغلاق. هذا يسمح لك بتعديل الخصائص بشكل مباشر داخل map.

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

    المزيد من المعلومات

    إضافة إلى التعديلات التي تم إجراؤها على لغة Swift مع إصدار 3.0، هناك بعض النقاط الإضافية التي يمكن أن تكون مفيدة لفهم أحدث التطورات في اللغة.

    أحد التغييرات الهامة هو الانتقال إلى استخدام الكائنات القابلة للتعديل (Mutable) بشكل أكبر، حيث يشجع Swift على استخدام الهياكل (Structures) بدلاً من الفئات (Classes) حينما يكون ذلك مناسبًا. الهياكل تُعتبر نوعًا من الكائنات القابلة للتعديل، مما يسهل عمليات التعديل دون الحاجة إلى الكثير من الاهتمام بالمشاكل المتعلقة بالمشاركة (Sharing) والإشارات (Reference).

    على سبيل المثال، في حالة الـ Gnome، إذا كانت هيكلًا، يمكنك استخدام الأسلوب الذي تم الإشارة إليه في السابق بشكل أكثر فعالية:

    swift
    struct Gnome { var age: Int // ... أي خصائص إضافية } var gnomes: [Gnome] = // ... قم بتعبئة المصفوفة بالكائنات Gnome gnomes = gnomes.map { var gnome = $0; gnome.age = 140; return gnome }

    هنا، نستخدم هيكلًا بدلاً من فئة، ونستفيد من القدرة الطبيعية على تعديل الهيكل بشكل مباشر دون الحاجة إلى inout.

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

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر