Вы найдете там некоторые хорошие практики/подсказки, которые, я думаю, очень актуальны, и это было хорошо для меня: они могут прийти от людей, с которыми я работал, от курсов/учебных пособий, которые я следовал, а также от других руководящих принципов и авторов хороших практик.
Вначале я столкнулся с проблемами при проверке конкретной кнопки хит или нет, просто потому, что она была исчезла (анимация) и поэтому не присутствует непосредственно в представлении. Одно интересное решение, которое я нашел, это это:
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 ) )Поскольку в Objective-C мы использовали CGrectMake для получения структуры CGRECT, поскольку для инициализации стойки необходимо (как в C, если моя память хороша) для создания сначала структуру, а затем присвоение значению переменным. С Swift, struct имеет конструкторы с параметрами, поэтому не нужно использовать внешние функции.
Вам больше не нужно удалять наблюдателя в функции Deinit, когда iOS> 9.0 больше
Из документации Apple
В OS X 10.11 и iOS 9.0 NSNotificationCenter и NSDistributedNotification Center больше не будут отправлять уведомления зарегистрированным наблюдателям, которые могут быть сведены в сфере [...] Это означает, что наблюдатели не обязаны не зарегистрировать в своем методе сделки.
Чтобы проверить, находится ли число между диапазоном, не делайте
if number >= 0 && number <= 100Вместо этого используйте диапазон и новостные операторы:
if 0 ... 100 ~= numberИспользуйте расширение при выполнении некоторого протокола (UitableView, Printable, ..), чтобы сохранить хорошо организованный код, если это не будет его роль.
// MARK: - TableView Delegate -
extension HomeViewController : UITableViewDataSource {
func tableView ( tableView : UITableView , numberOfRowsInSection section : Int ) -> Int {
return 5
}
func numberOfSectionsInTableView ( tableView : UITableView ) -> Int {
return 1
}
// etc.
} Используйте DET , пока XCODE кричит, чтобы вы могли заменить его VAR
Используйте Typealias, когда ссылаются на закрытие в нескольких местах
typealias CoolClosure = ( foo : Int ) -> Bool При доступе к x, y, width или высоте Cgrect предпочитают использовать rect.width, rect.miny и т. Д. Это быстрое расширение и которые по умолчанию стандартизируют значения вместо прямого доступа к элементу struct. Из ссылки на 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 Делегат -
- 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