Vous y trouverez de bonnes pratiques / indices, je pense que cela est très pertinent et c'était bon pour moi: ils peuvent provenir de personnes avec lesquelles j'ai travaillé, des cours / tutoriels que j'ai suivis, ainsi que d'autres directives et de bonnes pratiques auteurs.
Au début, j'ai rencontré des problèmes lors de la vérification si un bouton particulier est hittable ou non, simplement parce qu'il a été disparu (animation) et donc pas directement présent dans la vue. Une solution intéressante que j'ai trouvée est celle-ci:
let enableButton = app . buttons [ NSLocalizedString ( " Enable " , comment : " foo " ) ]
expectationForPredicate ( NSPredicate ( format : " hittable == true " ) , evaluatedWithObject : enableButton , handler : nil )
waitForExpectationsWithTimeout ( 3 , handler : nil ) Il attendra 3 secondes jusqu'à ce que le prédicat soit vrai (dans notre cas, le bouton est hittable, donc jusqu'à ce que le bouton apparaisse). Après l'heure écoulée, ce n'est pas vrai, il exécutera le xctAssert hittable == true .

En cliquant sur le bouton de texte, redirigez-moi une autre vue et en cliquant sur le carré, vérifiez-le.
Ce que je voulais faire, c'était simplement de vérifier le bouton, donc simplement taper sur le petit carré à gauche. Je l'ai fait avec:
let checkButtonCoordinate = app . buttons [ " CGUButton " ] . coordinateWithNormalizedOffset ( CGVector ( dx : 0 , dy : 0 ) )
checkButtonCoordinate . tap ( ) Vous pouvez ajouter des observateurs variables dans tous les types de variables, même globales et locales .
Voyons un exemple:
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
}
}
// ...
}
}Vous pouvez utiliser le storyboard pour initier certaines propriétés de votre objet au lieu de le faire par programme.
Ainsi, vous pouvez par exemple, remplacer:
self . debtView . layer . maskToBounds = true
self . debtView . layer . cornerRadius = 5.0par

Utilisez les initialiseurs de structure Swift native plutôt que d'utiliser des fonctions de cgGeométrie.
Alors remplacez:
let myButton = UIButton ( frame : CGRectMake ( 0.0 , 0.0 , self . bounds . width / 2 , self . bounds . height ) )par
let myButton = UIButton ( frame : CGRect ( x : 0.0 , y : 0.0 , width : self . bounds . width / 2 , height : self . bounds . height ) )Parce que dans OBJECTIF-C, nous avons utilisé pour utiliser CGrectMake pour obtenir une structure CGrect car pour initialiser une jambe de force, il est nécessaire (comme en C si ma mémoire est bonne) pour créer d'abord la structure, puis attribuer la valeur aux variables. Avec Swift, Struct a des constructeurs avec des paramètres, donc pas besoin d'utiliser des fonctions externes.
Vous n'avez pas besoin de supprimer l'observateur dans la fonction de déinit quand iOS> 9.0
De la documentation Apple
Dans OS X 10.11 et iOS 9.0 NSNotificationCenter et NSDistributedNotification, n'enverront plus de notifications aux observateurs enregistrés qui peuvent être traités [...] Cela signifie que les observateurs ne sont pas tenus de ne pas enregistrer dans leur méthode de trafic.
Pour vérifier si un nombre se situe entre une plage, ne faites pas
if number >= 0 && number <= 100Utilisez plutôt des opérateurs de gamme et d'informations:
if 0 ... 100 ~= numberUtilisez une extension lorsque vous vous conformez à un protocole (UableTview, imprimable, ..) pour garder un code bien organisé, sauf si c'est son rôle.
// MARK: - TableView Delegate -
extension HomeViewController : UITableViewDataSource {
func tableView ( tableView : UITableView , numberOfRowsInSection section : Int ) -> Int {
return 5
}
func numberOfSectionsInTableView ( tableView : UITableView ) -> Int {
return 1
}
// etc.
} Utilisez let jusqu'à ce que Xcode crie pour que vous puissiez le remplacer par var
Utilisez des typias lorsque les fermetures sont référencées à plusieurs endroits
typealias CoolClosure = ( foo : Int ) -> Bool Lorsque vous accédez à la largeur X, Y, à la largeur ou à la hauteur d'un cgrect, préfèrent utiliser rect.width, rect.miny, etc. qui sont une extension rapide et qui normalisent par défaut les valeurs au lieu de l'accès direct aux membres de structure directe. De la référence CGGEOMétrie d'Apple:
Toutes les fonctions décrites dans cette référence prennent des structures de données CGrect comme entrées standardiseront implicitement ces rectangles avant de calculer leurs résultats. Pour cette raison, vos applications devraient éviter de lire et d'écrire directement les données stockées dans la structure de données CGRect. Au lieu de cela, utilisez les fonctions décrites ici pour manipuler des rectangles et récupérer leurs caractéristiques.
Par exemple :
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, OKIndice de Stanford: En fait, en général, toute méthode qui a plus d'une douzaine de lignes de code sera probablement difficile à comprendre pour les lecteurs de votre code (et pourrait bien trahir une approche architecturale «moins qu'optimale»). Une solution possible sera donc d'ajouter des sous-fonctions à l'intérieur de la fonction principale. N'en abusez pas si vous avez 5 lignes dans votre code ..:]
Utilisez Pragma Mark pour organiser votre code
// 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