Sie werden dort einige gute Praktiken/Hinweise finden, die ich für sehr relevant halte, und das war gut für mich: Sie können von Menschen kommen, mit denen ich zusammengearbeitet habe, aus Kursen/Tutorials, die ich folgte, sowie von anderen Richtlinien und guten Praktikenautoren.
Am Anfang habe ich beim Überprüfen von Problemen gestoßen, ob ein bestimmter Knopf schäbig ist oder nicht, einfach weil er in (Animation) verblasst war und daher nicht direkt in der Ansicht vorhanden ist. Eine interessante Lösung, die ich gefunden habe, ist diese:
let enableButton = app . buttons [ NSLocalizedString ( " Enable " , comment : " foo " ) ]
expectationForPredicate ( NSPredicate ( format : " hittable == true " ) , evaluatedWithObject : enableButton , handler : nil )
waitForExpectationsWithTimeout ( 3 , handler : nil ) Es wird 3 Sekunden lang warten, bis das Prädikat wahr ist (in unserem Fall ist die Taste hittisch, bis die Taste angezeigt wird). Nach der verstrichenen Zeit wird es nicht wahr ist, es wird das Xctassert hittable == true ausführen.

Klicken Sie auf die Schaltfläche Text leiten Sie mir eine weitere Ansicht um und klicken Sie auf das Quadrat. Überprüfen Sie es.
Was ich tun wollte, war einfach die Taste zu überprüfen, also tippen Sie einfach auf das kleine Quadrat auf der linken Seite. Ich habe es mit:
let checkButtonCoordinate = app . buttons [ " CGUButton " ] . coordinateWithNormalizedOffset ( CGVector ( dx : 0 , dy : 0 ) )
checkButtonCoordinate . tap ( ) Sie können variable Beobachter in allen Arten von variablen, sogar globalen und lokalen Hindernissen hinzufügen.
Lassen Sie uns ein Beispiel sehen:
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
}
}
// ...
}
}Sie können das aus Ihrem Storyboard verwenden, um einige Eigenschaften Ihres Objekts zu initiieren, anstatt es programmgesteuert zu tun.
So können Sie zum Beispiel ersetzen:
self . debtView . layer . maskToBounds = true
self . debtView . layer . cornerRadius = 5.0von

Verwenden Sie die nativen Swift -Struktur -Initialisierer anstatt CGGGGGEOMetrie -Funktionen zu verwenden.
Also ersetzen Sie:
let myButton = UIButton ( frame : CGRectMake ( 0.0 , 0.0 , self . bounds . width / 2 , self . bounds . height ) )von
let myButton = UIButton ( frame : CGRect ( x : 0.0 , y : 0.0 , width : self . bounds . width / 2 , height : self . bounds . height ) )Da wir in Objective-C CGrectMake verwendet haben, um eine CGRECT-Struktur zu erhalten, da es zur Initialisierung einer Strute erforderlich ist, ist dies erforderlich (wie in C, wenn mein Speicher gut ist), zuerst die Struktur zu erstellen und dann Variablen Wert zuweisen. Mit Swift haben Struct Konstruktoren mit Parametern, sodass keine externen Funktionen verwendet werden müssen.
Sie müssen den Beobachter in der Deinit -Funktion nicht mehr entfernen, wenn iOS> 9.0
Aus Apple -Dokumentation
In OS X 10.11 und iOS 9.0 nsnotificationCenter und nsdistributedNotificationCenter senden keine Benachrichtigungen mehr an registrierte Beobachter, die möglicherweise verarbeitet werden [...], bedeutet, dass Beobachter nicht verpflichtet sind, ihre Handelsmethode zu registrieren.
Um zu überprüfen, ob sich eine Zahl zwischen einem Bereich befindet, tun Sie dies nicht
if number >= 0 && number <= 100Verwenden Sie stattdessen Reichweite und Nachrichtenbetreiber:
if 0 ... 100 ~= numberVerwenden Sie die Erweiterung , wenn Sie an ein Protokoll (UitableView, druckbar, ..) entsprechen, um einen gut organisierten Code zu führen, es sei denn, dies ist seine Rolle.
// MARK: - TableView Delegate -
extension HomeViewController : UITableViewDataSource {
func tableView ( tableView : UITableView , numberOfRowsInSection section : Int ) -> Int {
return 5
}
func numberOfSectionsInTableView ( tableView : UITableView ) -> Int {
return 1
}
// etc.
} Verwenden Sie Let , bis Xcode schreien, damit Sie es durch Var ersetzen können
Verwenden Sie Typen, wenn Verschlüsse an mehreren Stellen referenziert werden
typealias CoolClosure = ( foo : Int ) -> Bool Bevorzugen Sie beim Zugriff auf X, Y, Breite oder Höhe eines CGRECT die Verwendung von Rect.width, Rect.miny usw. Aus Apples CGGgeometry -Referenz:
Alle in dieser Referenz beschriebenen Funktionen, die CGRECT -Datenstrukturen als Eingaben aufnehmen, standardisieren diese Rechtecke implizit, bevor sie ihre Ergebnisse berechnen. Aus diesem Grund sollten Ihre Anwendungen das direkte Lesen und Schreiben der in der CGRECT -Datenstruktur gespeicherten Daten vermeiden. Verwenden Sie stattdessen die hier beschriebenen Funktionen, um Rechtecke zu manipulieren und ihre Eigenschaften abzurufen.
Zum Beispiel :
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, OKStanford Hint: Tatsächlich wird jede Methode, die mehr als ein Dutzend Codezeilen enthält, für die Leser Ihres Codes wahrscheinlich schwierig sein, um zu verstehen (und möglicherweise einen „weniger als optimalen“ architektonischen Ansatz verraten). Eine mögliche Lösung besteht also darin, Unterfunktionen innerhalb der Hauptfunktion hinzuzufügen. Missbrauche davon nicht, wenn du 5 Zeilen in deinem Code hast ..:]
Verwenden Sie Pragma Mark , um Ihren Code zu organisieren
// Mark: - UitableViewDataSource -Delegierter -
- 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