Creo que hay algunas buenas prácticas/sugerencias, creo que son muy relevantes y eso fue bueno para mí: pueden provenir de personas con las que trabajé, de cursos/tutoriales que seguí, y también de otras pautas y autores de buenas prácticas.
Al principio, encontré problemas al verificar si un botón en particular es Hitable o no, simplemente porque se desvaneció (animación) y, por lo tanto, no está presente directamente en la vista. Una solución interesante que encontré es esta:
let enableButton = app . buttons [ NSLocalizedString ( " Enable " , comment : " foo " ) ]
expectationForPredicate ( NSPredicate ( format : " hittable == true " ) , evaluatedWithObject : enableButton , handler : nil )
waitForExpectationsWithTimeout ( 3 , handler : nil ) Esperará 3 segundos hasta que el predicado sea verdadero (en nuestro caso, el botón es titular, así que hasta que aparezca el botón). Después de la hora transcurrida, no es cierto, ejecutará el XCTASSERT hittable == true .

Al hacer clic en el botón de texto, redirigirme otra vista y hacer clic en el cuadrado verifíquelo.
Lo que quería hacer era simplemente revisar el botón, así que solo golpea el pequeño cuadrado de la izquierda. Lo hice con:
let checkButtonCoordinate = app . buttons [ " CGUButton " ] . coordinateWithNormalizedOffset ( CGVector ( dx : 0 , dy : 0 ) )
checkButtonCoordinate . tap ( ) Puede agregar observadores variables en cualquier tipo de variable, incluso global y local .
Veamos un ejemplo:
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
}
}
// ...
}
}Puede usar desde su guión gráfico para iniciar algunas propiedades de su objeto en lugar de hacerlo programáticamente.
Entonces, puede, por ejemplo, reemplazar:
self . debtView . layer . maskToBounds = true
self . debtView . layer . cornerRadius = 5.0por

Use los inicializadores nativos de Swift Struct en lugar de usar funciones de CGGeometry.
Entonces reemplazar:
let myButton = UIButton ( frame : CGRectMake ( 0.0 , 0.0 , self . bounds . width / 2 , self . bounds . height ) )por
let myButton = UIButton ( frame : CGRect ( x : 0.0 , y : 0.0 , width : self . bounds . width / 2 , height : self . bounds . height ) )Porque en Objective-C, solíamos usar CGRECTMAKE para obtener una estructura CGRECT porque para inicializar un puntal, es necesario (como en C si mi memoria es buena) crear primero la estructura y luego asignar valor a las variables. Con Swift, Struct tiene constructores con parámetros, por lo que no es necesario usar funciones externas.
No es necesario eliminar el observador en la función deinit cuando iOS> 9.0 ya
De la documentación de Apple
En OS X 10.11 e iOS 9.0 NSNotificationCenter y NSDistributedNotificationCenter ya no enviarán notificaciones a los observadores registrados que pueden ser reparados [...] Esto significa que los observadores no están obligados a registrarse en su método de distribución.
Para verificar si un número está entre un rango, no lo haga
if number >= 0 && number <= 100Use el rango y los operadores de noticias:
if 0 ... 100 ~= numberUse la extensión cuando se ajuste a algún protocolo (UableView, imprimible, ..) para mantener un código bien organizado a menos que ese sea su papel.
// MARK: - TableView Delegate -
extension HomeViewController : UITableViewDataSource {
func tableView ( tableView : UITableView , numberOfRowsInSection section : Int ) -> Int {
return 5
}
func numberOfSectionsInTableView ( tableView : UITableView ) -> Int {
return 1
}
// etc.
} Use Let hasta que Xcode grite para que pueda reemplazarlo con var
Use typealias cuando se hace referencia a los cierres en varios lugares
typealias CoolClosure = ( foo : Int ) -> Bool Al acceder al X, Y, el ancho o la altura de un CGRECT, prefiera usar rect.Width, rect.Miny, etc. que son extensiones rápidas y que de forma predeterminada estandarizan los valores en lugar de el acceso directo a la estructura. De la referencia de CGGeometry de Apple:
Todas las funciones descritas en esta referencia que toman estructuras de datos CGRECT como entradas estandarizan implícitamente esos rectángulos antes de calcular sus resultados. Por esta razón, sus aplicaciones deben evitar leer y escribir directamente los datos almacenados en la estructura de datos CGRECT. En su lugar, use las funciones descritas aquí para manipular rectángulos y recuperar sus características.
Por ejemplo :
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, OKSugerencia de Stanford: de hecho, en general, cualquier método que tenga más de una docena de líneas de código probablemente será difícil para los lectores de su código (y podría traicionar un enfoque arquitectónico "menos óptimo"). Por lo tanto, una posible solución será agregar subfunciones dentro de la función principal. No abuses de eso si tienes 5 líneas en tu código ..:]
Use Pragma Mark para organizar su código
// Mark: - UableViewDataSource Delegate -
- 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