حفظ منطق التصفية في Swift Combine. الجزء 2

دمج البيانات الموجهة





تم إعداد ترجمة المقال خصيصًا لطلاب الدورة المتقدمة "iOS Developer" .





في الحلقة السابقة ، نجحنا في تصميم نموذج دفق من القيم ، حيث تم إرفاق عامل واحد بسيط ( delay) بكل قيمة .

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



أنواع عامل التشغيل


قبل أن نبدأ في تصميمها ، نحتاج إلى فهم أنواع العوامل الموجودة.

يقوم موقع ReactiveX بتقسيمها إلى حوالي 10 فئات: إنشاء ، تحويل ، تصفية ، دمج ، معالجة الأخطاء ، مساعدة ، مشروطة ، رياضية / مجمعة ، ضغط خلفي ، يمكن الاتصال به ويمكن ملاحظته (To). إذا كنت مهتمًا ، فإن ReactiveX لديه تفسير جيد لكل نوع وعامل.
ملاحظة: إذا كنت لم تكن مألوفة مع RxSwift، يمكن ملاحظتها في RxSwift ما يعادل الناشر في الجمع بين.
في الجزء السابق ، ذكرنا عامل التشغيل delay، الذي يشير إلى utilityالنوع المساعد ( ). سنركز اليوم على الحفاظ على عاملي تصفية ( filtering).



عوامل التصفية


يمنع هذا النوع من المشغلات كل أو بعض (أو لا شيء) عناصر التدفق من التحرك إلى أعلى إلى أعلى استنادًا إلى هذا الشرط.

إسقاط أولا


dropFirstتوقف انتقال nالعناصر الأولى . يمكننا ببساطة إضافته إلى تعدادنا Operator، نظرًا لبساطته.

enum Operator {
 case delay(seconds: Double)
 case dropFirst(count: Int)
}

يمكننا أيضًا بسهولة تحويل حالة القائمة هذه إلى Publisher.

extension Operator {func applyPublisher<T>(_ publisher: AnyPublisher<T, Never>) -> AnyPublisher<T, Never> { 
switch self {
   case .dropFirst(let count):
       return publisher.dropFirst(count).eraseToAnyPublisher()
 //   
 }}}

الآن dropFirstيمكن حفظ عامل التشغيل وعرضه في قائمة عوامل التشغيل.



التوفير dropFirstيشبه عامل التشغيل delay. ربما لا تختلف الترشيح عن عوامل التشغيل المساعدة. حسنًا ، لنجرب بيانًا آخر قبل أن نخرج بهذا الاستنتاج.

منقي


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

filter(_:)

إعادة نشر جميع العناصر التي تتطابق مع الإغلاق المحدد.

developer.apple.com


دعونا نلقي نظرة فاحصة على الطريقة filter.

func filter(_ isIncluded: @escaping (Self.Output) -> Bool) -> Publishers.Filter<Self>

isIncludedيأخذ إغلاقها نوعًا عالميًا ويعيد قيمة منطقية.

هل يوجد أي شيء في الأساس يمثل الشروط المنطقية ويعيد القيمة المنطقية؟ يذكرني بشيء؟

التصفية باستخدام NSPredicate


الجواب NSPredicate. إذا تمكنا من حفظ شروط التصفية كتعبيرات بتنسيق سلسلة ، فيمكننا ببساطة تمرير قيمة الدفق واستخدامها NSPredicateلتقييم النتائج.

دعنا نكمل ونضيف filterإلى القائمة.

enum Operator {
 case delay(seconds: Double)
 case dropFirst(count: Int)
 case filter(expression: String)
}

كل ما علينا فعله هو تصفية عبارات مثل %d !=3أو %@ != “D”؛ لذلك ، التعبير نوع مناسب. وبالمثل ، يجب أن نتمكن من نقل القائمة filter إلى الناشر.

extension Operator {
func applyPublisher<T>(_ publisher: AnyPublisher<T, Never>) -> AnyPublisher<T, Never> { 
 switch self {
   case .filter(let expression):
   return publisher.filter { value in
               NSPredicate(format: expression,
                           argumentArray: [value])
                .evaluate(with: nil) }.eraseToAnyPublisher()
      
     //   
 }}}

كما هو مخطط ، نرسل التعبير إلى NSPredicateجانب القيمة المرسلة من Publisher.

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



كما ترى ، تمت إضافة فلتر التصفية إلى هذه المجموعة المحفوظة من العبارات وتحويلها إلى Publisher لتصفية الرقم 3 من القيم الأعلى.



في الحلقة القادمة: إنقاذ مشغلي التحويل ، الخريطة والمسح الضوئي


في عرض GIF ، قد تجد أن قائمة عوامل التشغيل فارغة جدًا. في الأسابيع القليلة المقبلة ، سنقوم بملئه بأنواع مختلفة من عوامل التشغيل: عوامل التحويل ، mapو scan.
يمكنك العثور على شفرة المصدر في مستودع الجمع بين السحر والسويفي في مجلد ساحة اللعب.

نحن نتطلع إلى تعليقاتك وندعوك لفتح يوم في الدورة .

All Articles