البرمجة

تحسين استخدام Swift 2.2 لتسجيل إشعارات لوحة المفاتيح في UIViewController

في الكود الذي قدمته، تقوم بمحاولة تحديث تركيبة الكود لتتناسب مع Swift 2.2 واستخدام #selector syntax. ومع ذلك، تواجهك مشكلة في الجزء الخاص بالتمديد (extension) حيث يظهر لك خطأ “trailing where clause for extension of non-generic type”. دعني أشرح لك السبب وأقترح حلاً لهذه المشكلة.

الخطأ ينبغي أن يكون مرتبطًا بفهم خاطئ لكيفية استخدام where clause في تعريف التمديد. في Swift، يمكن استخدام where clause للتحقق من شروط النوع العام (generic types)، وليس للتمديد المباشر لنوع غير عام.

لحل هذه المشكلة، يمكنك استخدام البروتوكول بشكل أفضل بتعريف امتداد للبروتوكول نفسه، بدلاً من استخدام where clause مع تمديد UIViewController. هنا كيف يمكنك تعديل الكود:

swift
@objc protocol KeyboardNotificationDelegate { func keyboardWillShow(notification: NSNotification) func keyboardWillHide(notification: NSNotification) } extension KeyboardNotificationDelegate where Self: UIViewController { func registerKeyboardNotifications() { let isInPopover = navigationController?.popoverPresentationController != nil let ignore = isInPopover && DEVICE_IS_IPAD if !ignore { registerNotification(UIKeyboardWillShowNotification, selector: #selector(keyboardWillShow(_:))) registerNotification(UIKeyboardWillHideNotification, selector: #selector(keyboardWillHide(_:))) } } }

بهذا الشكل، يتم توسيع البروتوكول مع تحديد أنه يجب أن يكون النوع الذي يعتمد على البروتوكول هو UIViewController. وبذلك، يمكنك الآن استخدام هذا التمديد مع الأنواع التي تعتمد على البروتوكول KeyboardNotificationDelegate.

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

بالطبع، دعني أوسع شرحي حول الحل الذي قدمته وأقدم المزيد من المعلومات.

في الشيفت الأحدث من لغة البرمجة Swift، بدأت Apple في فرض تحسينات وتعديلات على اللغة لتحسين قوتها وأمانها. واحدة من هذه التحسينات هي تحديث طريقة استخدام الـ selectors.

في الكود الذي قدمته، كان لديك دالتين keyboardWillShow و keyboardWillHide في البروتوكول KeyboardNotificationDelegate. حتى تتمكن من استخدامهما كـ selectors، يجب أن يكون النوع الذي ينفذ البروتوكول UIViewController وأن تعتمد الدوال على objc.

المشكلة الأساسية كانت في استخدام where clause في جملة التمديد. في Swift، يجب أن يتم استخدام where clause فقط مع تعريفات الأنواع العامة (generic types) وليس مع تمديد الأنواع.

لذا، قمت بتعديل الكود ليستخدم extension KeyboardNotificationDelegate where Self: UIViewController بدلاً من extension UIViewController where Self: KeyboardNotificationDelegate. بهذا التعديل، يمكنك الآن استخدام التمديد على الأنواع التي تعتمد على البروتوكول KeyboardNotificationDelegate.

تأكد من أن الدوال keyboardWillShow و keyboardWillHide داخل البروتوكول مستعدة للتعامل مع الـ selectors بطريقة صحيحة وأن البرمجة تمر بدون أي أخطاء.

مقالات ذات صلة

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

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

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