نصائح لتصبح مطور سويفت أفضل

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

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

نصائح للمبتدئين

1. استخدام الملعب للتحقق من صحة:

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

يمكن أيضًا إنشاء ملعب داخل Xcode:

بمجرد دخولك الملعب ، يمكنك كتابة الكود على الجانب الأيسر وستكون النتيجة في الجانب الأيمن وفي أسفله:

2. استخدام الاختيارات بأمان:

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

هناك بعض الحالات الخاصة التي تستخدم فيها علامة التعجب (!).
على سبيل المثال: IBOutlet عندما تقوم بإنشاء منافذ من أداة إنشاء الواجهة ، فسيكون ذلك غير اختياري ضمنيًا لأن UIKit تفترض أنك قمت بتوصيل / توصيل منفذ الوصول إلى أداة إنشاء الواجهة . لذلك من المخاطرة استخدام عملية فك ضمنية لقيمة اختيارية.
يمكننا استخدام إذا ترك نمط للتعامل مع هذا:

اسم فار: سلسلة؟ = "الفرح"
فار اسم العائلة: سلسلة؟
print (name) // النتيجة: اختياري ("Joy")
print (الاسم!) // النتيجة: الفرح
إذا ترك قيمة = اسم {
    طباعة (قيمة)
} آخر {
    طباعة ("الاسم غير مضبوط")
}
// النتيجة: الفرح ، لأن الاسم له قيمة
إذا سمحت lastNameNew = اسم العائلة {
    طباعة (lastNameNew)
} آخر {
    طباعة ("الاسم الأخير غير مضبوط")
}
// النتيجة: لم يتم تعيين الاسم الأخير ، لأن اسم العائلة لا يحتوي على أي قيمة

3. إدارة الثوابت في ملف واحد:

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

التعداد AppConstants {
   دع ثابت ثابت AppName = "MyFirstApp"
   السماح الثابت NoInternetMessage = "عذرًا ، لا يوجد اتصال بالإنترنت"
}

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

4. استخدام وظيفة متداخلة:

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

func chooseStepFunction (للخلف: Bool) -> (Int) -> Int {
   func stepForward (الإدخال: Int) -> Int {return input + 1}
   func stepBackward (الإدخال: Int) -> Int {return input - 1}
   العودة الى الوراء؟ stepBackward: stepForward
}
var currentValue = -4
دع moveNearerToZero = chooseStepFunction (للخلف: currentValue> 0)
يشير / moveNearerToZero الآن إلى الدالة stepForward () المتداخلة
بينما التيار الحالي! = 0 {
   طباعة ("\ (currentValue) ...")
   currentValue = moveNearerToZero (currentValue)
}
طباعة ( "الصفر!")
//نتيجة:
// -4 ...
// -3 ...
// -2 ...
// -1 ...
// صفر!
نصيحة أخيرة أخرى لك يا رفاق ، يمكنك الذهاب للحصول على نصائح للمحترفين أيضًا.

نصائح للمحترفين

  1. استخدام الحرس اسمحوا:

عندما يتم تنفيذ أي إجراء ، فأنت تريد أن تتأكد من أن جميع البيانات المطلوبة متوفرة للعمل بشكل صحيح. بعد ذلك عادةً قام المطورون بحل هذا بطريقتين ، هما:

ا. أهرامات الموت:

عندما يرغب المطور في التأكد من كل البيانات المطلوبة ، يتحقق من صحة كل خاصية مستخدمة ، على النحو التالي:

فار اسم المستخدم: سلسلة؟
فار البريد الإلكتروني: سلسلة؟
فار كلمة المرور: سلسلة؟
var policyAccepted: Bool = false
func checkAndSave () {
   إذا تركت uname = userName {
      إذا سمح البريد = البريد الإلكتروني {
         إذا سمحت pwd = كلمة المرور {
            إذا تم قبول السياسة {
               / / تفعل الشيء العظيم ، مثل الاشتراك
            }
         }
      }
   }
}

ومن المعروف باسم أهرامات الموت لأننا خلق هرم الشروط

ب. العائد الشرطي:

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

func checkAndSave () {
   إذا تركت uname = userName {return}
   إذا سمح البريد = البريد الإلكتروني {return}
   إذا سمحت pwd = password {return}
   إذا تم قبول السياسة {return}
   
   / / تفعل الشيء العظيم ، مثل الاشتراك
}

يُعرف باسم الإرجاع المشروط لأننا نعود إلى كل حالة فشل .
- الحل الأول ليس جيدًا بمعنى قراءة التعليمات البرمجية وتصحيح الأخطاء ، لذلك لن ننجح في ذلك.
- الحل الثاني ليس جيدًا بما فيه الكفاية أيضًا ، نظرًا لأن العودة غير ضرورية من الوظيفة ، ألا يمكنك معرفة سبب إعادتنا لها؟
- حل آخر ، يمكننا أن نستخدمه إذا سمحت ولكن لديه أيضًا بعض القيود لأن نطاق المتغير سيكون في كتلة if ، لذلك سوف نحتاج مرة أخرى إلى هرم العذاب .

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

func checkAndSave () {
guard let uname = اسم المستخدم ، اسمح للبريد = البريد الإلكتروني ، اسمح لـ pwd = كلمة المرور ، policyAccepted else {
   إرجاع
}
/ / تفعل الشيء العظيم ، مثل الاشتراك
}

2. استخدام كتلة تأجيل:

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

func processFile (اسم الملف: سلسلة) رميات {
   إذا كان موجودًا (اسم الملف) {
      اسمح للملف = open (اسم الملف)
      يتم تعريف // defer block هنا لإغلاق الملف المفتوح
      تأجيل {
         إغلاق الملف)
      }
      اسم المستخدم واسم المستخدم = getUserName ()
      حارس اسم المستخدم! = "" آخر {return}
      file.write (اسم المستخدم)
      دع userAge = getUserName ()
      guard userAge> = 18 else {return}
      file.write (userAge)
      
      يتم استدعاء // close (ملف) هنا ، في نهاية النطاق.
   }
}

3. كلمة السر:

في وقت مبكر بسرعة إذا كنت تريد استخدام نمط مطابقة مع الشرط ، فأنت تستخدم عبارات if بشكل منفصل ، مثل:

فار webUrl: سلسلة؟ = "https://medium.com"
إذا سمحت path = webUrl {
   if path.hasPrefix ("https") {
      / / تفعل الشيء العظيم
   }
}

في وقت لاحق ، قدم Swift حيث الكلمة الرئيسية في الإصدار 2.0 للقيام بنفس الشيء في بيان واحد ، على النحو التالي:

إذا سمحت path = webUrl حيث path.hasPrefix ("https") {
   / / تفعل الشيء العظيم
}

الآن ، استبدل Swift مكان الكلمة الرئيسية بعلامة (، فاصلة) ، مثل:

إذا سمحت path = webUrl، path.hasPrefix ("https") {
   / / تفعل الشيء العظيم
}

لذلك ، حيث هو أكثر استخدام الكامل. قراءة المزيد عن أين

4. جعل تفويض مخصص ضعيفة:

انتظر ... ما هو الضعف والمفوض؟ دعنا نتحقق من مطور التفاح للحصول على تعريف دقيق.
المرجع الضعيف هو مرجع لا يحتفظ بقوة في المثيل الذي يشير إليه ، وبالتالي لا يمنع ARC من التخلص من المثيل المشار إليه.
التفويض هو نمط تصميم يمكّن الفصل أو الهيكل من تسليم (أو تفويض) بعض مسؤولياته إلى مثيل من نوع آخر.

كلما قمت بتعيين مفوض أي فئة A في الفئة B ، فأنت تحتفظ بالإشارة القوية للفئة A في الفئة B ، وسوف تحتفظ الفئة A أيضًا بالإشارة القوية للفئة B كمفوض. لذلك سوف يستمر في الاحتفاظ بدورة للكائنات وسيكون هناك مشكلات متعلقة بالذاكرة وسوف يتعطل التطبيق .

لذلك ، في المرة القادمة التي ستنشئ فيها المفوضين المخصصين ، تأكد من إنشائها كمرجع ضعيف as ، على النحو التالي:

بروتوكول myCustomDelegation: class {
   func newFunction (vaueToBeShare: String)
}
الفئة (أ)
   مندوب var ضعيف: myCustomDelegation؟
   // جعل المفوض ضعيفًا لكسر دورة الاستبقاء
}
الفئة ب: myCustomDelegation {
   وظيفة func الداخلية (vaueToBeShare: String) {
      / / افعل شيئًا هنا عند طرد المفوض
   }
   دع obj = A () / / يحفظ إشارة قوية للفئة A
   فيه() {
      obj.delegate = self / / تعيين فئة A لمفوض الفئة B
   }
}

5. حذف باستخدام KVO:

KVO (Key Value Observer) ، حيث يمكنك ضبط ومراقبة أي مفتاح والإجراء عند تغيير قيمة هذا المفتاح. إنها طريقة جيدة ولكنها ليست أفضل بشكل سريع لأننا نسينا بعض الوقت لإزالة المراقب الذي سيؤدي إلى تعطل التطبيق ، أو أن المراقبين يبثون دائمًا بحيث يكون الألم ممتلئًا.

لقد قمنا باستبدال جهاز KVO بشكل سريع وهو مراقب الممتلكات. باستخدامه ، يمكننا اتخاذ إجراء عندما تتغير قيمة العقار. هناك :

  • يتم استدعاء willSet قبل تخزين القيمة مباشرة.
  • يسمى didSet مباشرة بعد تخزين القيمة الجديدة.
فئة newClass {
   var myNewObj: Int = 0 {
      willSet (newValue) {
         طباعة ("newValue = \ (newValue) ، oldValue = \ (myNewObj)")
      }
 
      didSet {
         طباعة ("oldValue = \ (oldValue) ، currentValue = \ (myNewObj)")
      }
   }
}
دع obj = newClass ()
obj.myNewObj = 5
// النتيجة: newValue = 5 ، oldValue = 0
// النتيجة: oldValue = 0 ، currentValue = 5
obj.myNewObj = 8
// النتيجة: newValue = 8 ، oldValue = 5
// النتيجة: oldValue = 5 ، currentValue = 8

يتم استدعاء مراقبي willSet و didSet لـ myNewObj عندما يتم تخصيص الخاصية بقيمة جديدة. هذا صحيح حتى إذا كانت القيمة الجديدة هي نفس القيمة الحالية .

إذا كنت تقوم بتغيير قيمة property1 في خاصية مراقبة الممتلكات 2 و property2 في خاصية مراقبة الممتلكات 1 ، فستكون سلسلة ، وتعطي خطأ التنفيذ السيئ في وقت التشغيل ، ولن يقول أي شيء في وقت الترجمة.

6. استخدام القصص المصورة متعددة:

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

use "استخدام القصة المصورة لقصة كاملة وليس لمشروع كامل"

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

التعداد AppStoryboards: String {
   الحالة الرئيسية = "الرئيسية"
   حالة PreLogin = "PreLogin"
   var var: UIStoryboard {
      إرجاع UIStoryboard (الاسم: self.rawValue ، الحزمة: لا شيء)
   }
}
// الاستخدام:
واسمحوا القصة المصورة = AppStoryboard.Main.instance
اسمح لـ loginVC = AppStoryboard.PreLogin.instance.instantiateViewController (withIdentifier: "LoginVC")
// الطريق القديم
let storyboard = UIStoryboard (الاسم: "الرئيسي" ، الحزمة: Bundle.main)

7. حذفت باستخدام Globals:

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

مثل:

// متوسط ​​الممارسة
مربع func (x: Int) -> Int {return x * x}
دع المربع 3 = مربع (س: 3) // الطباعة: 9
square (x: square3) // Print: 81
// الممارسة العظمى
التمديد Int {
   var square: Int {return self * self}
}
3. مربع // الطباعة: 9
3. مربع. / / طباعة: 81

احصل على بعض الامتدادات من GitHub.

8. استخدام الجينات:

تتيح لك الأدوية العامة الإعلان عن متغير يمكن ، عند التنفيذ ، تعيين مجموعة من الأنواع المحددة من قبلنا.

// متوسط ​​الممارسة
var stateName = ["Uttar Pradesh" ، "Kerala" ، "Assam" ، "Punjab"]
var areaArray = [240928 ، 38863 ، 78438 ، 50362]
فار النمو = [20.1 ، 4.9 ، 16.9 ، 13.7]
func printStateName (obj: [String]) {print ("stateNames: \ (obj)")}
func printStateArea (obj: [Int]) {print ("areas: \ (obj)")}
func printStateGrowth (obj: [Double]) {print ("نمو السكان: \ (obj)")}
printStateName (obj: stateName)
printStateArea (obj: areaArray)
printStateGrowth (الهدف: النمو)
// الممارسة العظمى
func printArray  (_ obj: T ، message: String = "") {print ("\ (message) \ (obj)")}
printArray (stateName ، الرسالة: "stateNames:")
printArray (areaArray ، الرسالة: "المناطق:")
printArray (النمو ، الرسالة: "النمو السكاني:")

شكرا لك القراءة ، يرجى الضغط على أيقونة التوصية إذا أعجبك هذه المجموعة