ios - Xcode 10.2 مع SWIFT 5.0 مترجم-مسألة وراثة البروتوكول




protocols (2)

لدينا مشكلة كبيرة في إصدار Xcode الحالي (10.2).

هناك فئة BasicViewController بالتوقيع التالي:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

ثم لدينا فئة أخرى مثل ExampleViewController: BasicViewController الذي لديه بعض المنطق الإضافي.

وهنا يظهر الجزء الخداع...

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

لا أستطيع التفكير في أي حال عندما يحدث هذا. ويزداد الأمر سوءًا ، لأنني وجدت المزيد من المشكلات المشابهة في أساليب UITableViewDelegate لم يتم استدعاؤها في الفصل الفرعي فقط عند تشغيل التطبيق المؤرشفة. هل يمكن أن تكون مشكلة في بعض عمليات التحسين أثناء الأرشفة وتقديم التطبيق؟

dataSource أننا قمنا بتعيين dataSource delegate الجدول بشكل صحيح ، ولا توجد أدوات التعرف على الإيماءات فوق الجدول. نفس المنطق يعمل بشكل جيد بعد تشغيل التطبيق للمرة الثانية / الثالثة ، لكنه يفشل لأول مرة بعد تنظيف عميق للمشروع.

لقد أجرينا اختبارًا UITableViewDataSource و UITableViewDelegate في الفصل UITableViewDelegate ، ثم يعمل كما هو متوقع في كل مرة. يبدو أن ورث البروتوكولات لا يعمل بشكل جيد. إذا احتفظنا بالبروتوكولات في الأصل ونضيفها أيضًا في الفصل الفرعي ، فيُفترض أن البروتوكولات الموجودة في الفصل الفرعي زائدة عن الحاجة.

وقد واجه أي شخص أي شيء مماثل؟ أي اقتراحات هي موضع ترحيب.


قد تكون قيد التشغيل في https://bugs.swift.org/browse/SR-10257 في برنامج التحويل البرمجي Swift 5.0. قد يحدث هذا إذا كان لديك ثلاثة ملفات على الأقل:

  1. BasicViewController.swift
  2. SomeOtherFile.swift
  3. ExampleViewController.swift

إذا قام SomeOtherFile.swift بإجراء أي مكالمات على قيمة AnyObject نمط ، فأنت تقوم wholemodule في وضع wholemodule ، ويتم تمرير الملفات إلى برنامج التحويل البرمجي بالترتيب أعلاه (مع SomeOtherFile.swift في منتصف الاثنين) ، ثم يبدو فشل المحول البرمجي في استنتاج @objc بشكل صحيح @objc func tableView(_:, didSelectRowAt:) . يمكنك @objc عن طريق وضع علامة عليها صراحة مع @objc في الوقت الحالي.


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





protocols