قواعد سويفت لينت المخصصة

مرحباً هبر! اسمي Alex ، أنا iOS Developer في FINCH. قريباً سيكون العام الجديد هو الوقت المناسب للبدء في العيش بطريقة مختلفة ، وهذا شيء رائع مثل SwiftLint سيساعد في ذلك. سأخبرك في هذا المقال عن سبب تنفيذه في جميع المشاريع ، بما في ذلك المشروعات القديمة والحيوانات الأليفة ، وأعرض أيضًا كيفية الحصول على أقصى استفادة من هذه الأداة باستخدام خطوط منتظمة.

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

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

لذلك ، تذكر:

1. يتيح لك SwiftLint القيام بما يلي:

  • نمط واحد مع أدلة النمط

في الواقع كل شيء.

يمكن أن تنتهي المقالة هنا ، لكن إذا كان الأمر كذلك ، فلن أبدأ في كتابة هذه المقالة على الإطلاق. ومن المثير للاهتمام ، SwiftLint لا يسمح لك أن تفعل - كتابة ال ... إصلاحات عاجلة.

2. يسمح لك SwiftLint بمنع:

  • قوة التفاف
  • المندوبين قوية
  • مقياس مكابي
  • شيء آخر ...

أعتقد أنه من الجيد أن أكون في مأمن من مثل هذه الأخطاء ، أليس كذلك؟ هذا مفيد بشكل خاص لمطور مبتدئ ، لأنه يتعلم فقط وفي بعض الأحيان لا يشك في حدوث مثل هذه الأخطاء.

3. Swiftlint يمكن توسيعها وفقا لقواعدها الخاصة.

سأبدأ بتحديد النهائي للفصول التي لن تكون والدًا للآخرين. بفضل النهائي ، فإننا نوفر وقت تجميع المشروع. إليك ما تخبرنا به وثائق Apple حول الفصول النهائية:
لا يمكن عرض الإعلانات ذات الوصول الداخلي (الافتراضي إذا لم يتم الإعلان عن أي شيء) إلا داخل الوحدة النمطية حيث يتم الإعلان عنها. نظرًا لأن Swift يقوم عادةً بتجميع الملفات التي تشكل وحدة نمطية بشكل منفصل ، فلن يتمكن المحول البرمجي من التحقق مما إذا كان الإعلان الداخلي قد تم تجاوزه في ملف مختلف أم لا. ومع ذلك ، إذا تم تمكين تحسين الوحدة النمطية بالكامل ، يتم تجميع كل الوحدة معًا في نفس الوقت. يسمح هذا للمترجم بإجراء استنتاجات حول الوحدة النمطية بأكملها معًا واستنتاج التصريحات النهائية بالتعريفات الداخلية إذا لم تكن هناك تخطيات مرئية.

سوف نحل هذا الإهمال من خلال موسم منتظم بسيط. بعد ذلك ، سأكتب على الفور لروبي حتى تتمكن من تضمين الكود مباشرة في مشروعك:

final_class: included: ".*.swift" name: "Final class requrement" regex: '^class' message: "All classes must be final or nonfinal" saverity: error 

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

 class SomeClass { } //  internal class SomeClass { } //  /* @non-final */ class SomeClass { } //   

مطلوب النقطة التالية الحرف الأول. نحن في الشركة لا نستخدم لوحات العمل ، لذلك فإن تحديد مُهيئ فادح في كل فئة من فئات UIView ليس أمرًا طبيعيًا تمامًا. في هذه الحالة ، لدينا NLView (NL - NibLess) الخاصة بنا - فئة يتم فيها تنفيذ init المطلوب مرة واحدة فقط. ربما لا يعرف المطورين الجدد في المشروع هذا ، لكن الاستفادة من SwiftLint دائمًا ما تتأخر بدلاً من العميل المسؤول. أو معها.

 required_init: regex: 'required init\?\(coder: NSCoder\)' message: "Use NL class instead" 

إذا كنت لا تزال تستخدم مجموعات القصص المصورة ، فيمكنك استخدام القواعد التالية لمعرفة أن جميع لوحات القصص المصورة خاصة:

 open_iboutlets: included: ".*.swift" name: "IBOutlet opening" regex: '@IBOutlet ?(weak){0,1} var' message: "IBOutlet should be private" severity: error 

 open_ibaction: included: ".*.swift" name: "IBAction opening" regex: '@IBAction func' message: "IBAction should be private" severity: error 

يحدث غالبًا أن يتم استخدام Foundation حيث لا لزوم لها تمامًا. لذلك ، من الأفضل تسليط الضوء عليه في كل مرة حتى لا تنسى:

  foundation_using: included: ".*.swift" regex: 'import Foundation' message: "Do you really need for Foundation ???" 

آمل أن يعلم الجميع أن الطباعة هي عملية صعبة إلى حد ما ، مما قد يضر بشدة بأداء التطبيق (وخاصة في الحلقات). الحكم الوحيد - يجب أن لا تكون المطبوعات على الإطلاق.

 print_using: regex: 'print' message: "Print decrease performance of the app" severity: error 

وأيضًا ، يجب ألا تنشئ بروتوكولات للفئة فقط ، نظرًا لأن هناك احتمالًا لإهمال بناء جملة مثل هذا ولا يوصى به مطورو Swift .

 class_protocol: regex: ': class' message: "Use Anyobject instead" 

فيما يلي قاعدة المشروعات التي تستخدم R.swift.

 image_name_initialization: included: ".*.swift" name: "Image initialization without R.swift" regex: 'UIImage\(named:[^)]+\)' message: "Use R.image.name() or typealias of this instead" severity: error 

هذا ليس سوى جزء صغير مما يمكن أن أتوصل إليه ، ولكن هناك أمثلة أقل على الإنترنت. يمكنك إلقاء نظرة على "مجموعتي" بأكملها على جيثب .

شكرا لاهتمامكم إذا كنت تستخدم SwiftLint أيضًا مع قواعد مخصصة ، فأخبرنا عنها - سأكون سعيدًا لمناقشة الحالات المحتملة.

Source: https://habr.com/ru/post/ar481666/


All Articles