Você encontrará algumas boas práticas/dicas que acho muito relevantes e isso foi bom para mim: elas podem vir de pessoas com quem trabalhei, de cursos/tutoriais que segui e também de outras diretrizes e autores de boas práticas.
No começo, encontrei problemas ao verificar se um botão específico é hittable ou não, simplesmente porque estava desbotado (animação) e, portanto, não está diretamente presente na visualização. Uma solução interessante que encontrei é esta:
let enableButton = app . buttons [ NSLocalizedString ( " Enable " , comment : " foo " ) ]
expectationForPredicate ( NSPredicate ( format : " hittable == true " ) , evaluatedWithObject : enableButton , handler : nil )
waitForExpectationsWithTimeout ( 3 , handler : nil ) Ele aguardará 3 segundos até que o predicado seja verdadeiro (no nosso caso, o botão é hittable; portanto, até que o botão apareça). Após o tempo decorrido, não é verdade, ele executará o XcTassert hittable == true .

Clicar no botão de texto redireciona -me outra visualização e clicando no quadrado, verifique -o.
O que eu queria fazer era apenas verificar o botão, então apenas tocando no pequeno quadrado à esquerda. Eu fiz isso com:
let checkButtonCoordinate = app . buttons [ " CGUButton " ] . coordinateWithNormalizedOffset ( CGVector ( dx : 0 , dy : 0 ) )
checkButtonCoordinate . tap ( ) Você pode adicionar observadores variáveis em qualquer tipo de variável, mesmo global e local .
Vamos ver um exemplo:
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
}
}
// ...
}
}Você pode usar o seu storyboard para iniciar algumas propriedades do seu objeto, em vez de fazê -lo programaticamente.
Assim, você pode, por exemplo, substituir:
self . debtView . layer . maskToBounds = true
self . debtView . layer . cornerRadius = 5.0por

Use os inicializadores nativos da Swift Struct, em vez de usar as funções de cGGEOMETRIA.
Portanto, substitua:
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 no Objective-C, costumávamos usar o CGrectMake para obter uma estrutura CGrect porque, para inicializar um suporte, é necessário (como em c se minha memória for boa) para criar primeiro a estrutura e depois atribuir valor a variáveis. Com o SWIFT, o STRUT possui construtores com parâmetros, portanto, não é necessário usar funções externas.
Você não precisa remover o observador na função deinit quando iOS> 9.0
Da documentação da Apple
No OS X 10.11 e iOS 9.0 NSNotificationCenter e NSDistributedNotificationCenter não enviará mais notificações para observadores registrados que podem ser desalocados [...] Isso significa que os observadores não são obrigados a não registrar em seu método de desalocação.
Para verificar se um número está entre um intervalo, não faça
if number >= 0 && number <= 100Use o alcance e os operadores de notícias :
if 0 ... 100 ~= numberUse a extensão ao estar em conformidade com algum protocolo (uabableView, imprimível, ..) para manter um código bem organizado, a menos que esse seja o seu 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 até o Xcode gritar para que você possa substituí -lo por Var
Use typeAalias quando o fechamento for referenciado em vários lugares
typealias CoolClosure = ( foo : Int ) -> Bool Ao acessar o X, Y, largura ou altura de um CGrect, prefira usar o Rect.Width, Rect.Miny, etc. que são extensões rápidas e que, por padrão, padronizam valores em vez do acesso direto ao membro da estrutura. Da referência CGGGGGGEROMETRIA da Apple:
Todas as funções descritas nesta referência que tomam estruturas de dados CGRECT como entradas padronizam implicitamente esses retângulos antes de calcular seus resultados. Por esse motivo, seus aplicativos devem evitar ler e escrever diretamente os dados armazenados na estrutura de dados CGRECT. Em vez disso, use as funções descritas aqui para manipular retângulos e recuperar suas características.
Por exemplo :
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, OKDica de Stanford: De fato, em geral, qualquer método que tenha mais de uma dúzia de linhas de código provavelmente será difícil para os leitores do seu código entender (e poderão trair uma abordagem arquitetônica "menos do que ideal"). Portanto, uma solução possível será adicionar subfunções dentro da função principal. Não se abuse disso se você tiver 5 linhas em seu código ..:]
Use Pragma Mark para organizar seu código
// Mark: - uabableViewDataSource 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