ستجد هناك بعض الممارسات/التلميحات الجيدة التي أعتقد أنها ذات صلة للغاية وكان ذلك جيدًا بالنسبة لي: يمكن أن يأتي من أشخاص عملت معهم ، من الدورات/البرامج التعليمية التي تابعتها ، وأيضًا من المبادئ التوجيهية الأخرى ومؤلفي الممارسات الجيدة.
في البداية ، واجهت مشكلات عند التحقق مما إذا كان زر معين قابلاً للضرب أم لا ، وذلك ببساطة لأنه تلاشى (الرسوم المتحركة) وبالتالي غير موجود مباشرة في العرض. حل واحد مثير للاهتمام الذي وجدته هو:
let enableButton = app . buttons [ NSLocalizedString ( " Enable " , comment : " foo " ) ]
expectationForPredicate ( NSPredicate ( format : " hittable == true " ) , evaluatedWithObject : enableButton , handler : nil )
waitForExpectationsWithTimeout ( 3 , handler : nil ) سوف ينتظر لمدة 3 ثوانٍ حتى يكون المسند صحيحًا (في حالتنا ، يكون الزر قابلاً للضرب ، لذلك حتى يظهر الزر). بعد الوقت المنقضي ، ليس صحيحًا ، فسيقوم بتنفيذ XctAssert hittable == true .

النقر فوق زر النص إعادة توجيه طريقة عرض أخرى ، والنقر فوق المربع تحقق من ذلك.
ما أردت فعله هو مجرد التحقق من الزر ، لذلك فقط النقر على المربع الصغير على اليسار. لقد فعلت ذلك مع:
let checkButtonCoordinate = app . buttons [ " CGUButton " ] . coordinateWithNormalizedOffset ( CGVector ( dx : 0 , dy : 0 ) )
checkButtonCoordinate . tap ( ) يمكنك إضافة مراقبين متغيرين في أي أنواع من المتغيرات ، حتى عالميًا ومحليًا .
دعونا نرى مثالا:
var numberOfPerson = 0 {
didSet {
// Do something
}
}
class Person {
var name = " Anonyme " {
didSet {
// Do something else
}
}
func showResume ( ) {
var resume : String ? {
didSet {
// Do what you need to do
}
}
// ...
}
}يمكنك استخدام لوحة القصة الخاصة بك لبدء بعض خصائص كائنك بدلاً من القيام به برمجيًا.
لذلك ، يمكنك على سبيل المثال استبدال:
self . debtView . layer . maskToBounds = true
self . debtView . layer . cornerRadius = 5.0بواسطة

استخدم المهيئات المبدئية Swift Struct الأصلية بدلاً من استخدام وظائف قياس cggeometry.
لذا استبدل:
let myButton = UIButton ( frame : CGRectMake ( 0.0 , 0.0 , self . bounds . width / 2 , self . bounds . height ) )بواسطة
let myButton = UIButton ( frame : CGRect ( x : 0.0 , y : 0.0 , width : self . bounds . width / 2 , height : self . bounds . height ) )لأنه في الهدف-C ، اعتدنا على استخدام CGRECTMAKE للحصول على بنية CGRECT لأنه لتهيئة دعامة ، من الضروري (كما في C إذا كانت ذاكرتي جيدة) لإنشاء الهيكل أولاً ، ثم تعيين قيمة للمتغيرات. مع Swift ، struct لديها منشئات ذات معلمات ، لذلك لا حاجة لاستخدام وظائف خارجية.
لا تحتاج إلى إزالة المراقب في وظيفة deinit عندما iOS> 9.0 بعد الآن
من وثائق Apple
في OS X 10.11 و iOS 9.0 NSNotificationCenter و NSDistributedNotificationCenter لن يرسلوا إشعارات إلى المراقبين المسجلين الذين قد يتم تعاملهم [...] وهذا يعني أن المراقبين ليسوا مطلوبين لعدم التسجيل في طريقة تحديد التخصيص الخاصة بهم.
للتحقق مما إذا كان الرقم بين النطاق ، لا تفعل
if number >= 0 && number <= 100استخدم مشغلي النطاق والأخبار بدلاً من ذلك :
if 0 ... 100 ~= numberاستخدم التمديد عند مطابقة لبعض البروتوكول (UitableView ، قابل للطباعة ، ..) للحفاظ على رمز منظم جيدًا ما لم يكن هذا دوره.
// MARK: - TableView Delegate -
extension HomeViewController : UITableViewDataSource {
func tableView ( tableView : UITableView , numberOfRowsInSection section : Int ) -> Int {
return 5
}
func numberOfSectionsInTableView ( tableView : UITableView ) -> Int {
return 1
}
// etc.
} استخدم LET حتى يصرخ XCODE حتى تتمكن من استبداله بـ VAR
استخدم typealias عند الرجوع إلى الإغلاق في أماكن متعددة
typealias CoolClosure = ( foo : Int ) -> Bool عند الوصول إلى X أو Y أو العرض أو ارتفاع CGRECT ، تفضل استخدام Rect.WIDTH ، Rect.Miny ، إلخ .. تمثل التمديد السريع وذلك بشكل افتراضي القيم الموحدة بدلاً من وصول الأعضاء المباشر. من مرجع القياس cggeometry من Apple:
جميع الوظائف الموضحة في هذا المرجع التي تأخذ هياكل بيانات CGRECT كمدخلات توحيد ضمنيًا تلك المستطيلات قبل حساب نتائجها. لهذا السبب ، يجب أن تتجنب تطبيقاتك قراءة البيانات المخزنة في بنية بيانات CGRECT مباشرة. بدلاً من ذلك ، استخدم الوظائف الموضحة هنا لمعالجة المستطيلات واسترداد خصائصها.
على سبيل المثال :
let rect = CGRect ( origin : CGPoint ( x : 0.0 , y : 0.0 ) , size : CGSize ( width : - 40.0 , height : - 40.0 ) )
rect . size . width // return -40, Not good, negative value
rect . width // return 40, OK
rect . origin . y // return 0.0, Not OK
rect . minY // return -40.0, OKتلميح ستانفورد: في الواقع ، بشكل عام ، من المحتمل أن يكون أي طريقة تحتوي على أكثر من عشرة خطوط من الكود من الصعب على قراء الكود لفهمها (وقد تخون جيدًا النهج المعماري "الأقل الأمثل"). لذلك سيكون الحل المحتمل هو إضافة الوظائف الفرعية داخل الوظيفة الرئيسية. لا تسيء إلى ذلك إذا كان لديك 5 أسطر في الكود الخاص بك ..:]
استخدم Pragma Mark لتنظيم الكود الخاص بك
// Mark: - UitableViewDataSource Pepegate -
- You can consider making **TODO/FIXME as warning**, sometimes that helps !
- Having a clear application architecuture is good, having a clear/reusable code is awesome. So you better be documented about **design patterns** :
- http://www.raywenderlich.com/46988/ios-design-patterns
- http://www.raywenderlich.com/86053/intermediate-design-patterns-in-swift
- https://github.com/ochococo/Design-Patterns-In-Swift