In Ziel C kann ich #pragma mark
Abschnitte meines Codes im Symbolnavigator markieren. Da dies ein C-Präprozessorbefehl ist, ist er in Swift nicht verfügbar. Gibt es dafür in Swift einen Ersatz oder muss ich hässliche Kommentare verwenden?
In Ziel C kann ich #pragma mark
Abschnitte meines Codes im Symbolnavigator markieren. Da dies ein C-Präprozessorbefehl ist, ist er in Swift nicht verfügbar. Gibt es dafür in Swift einen Ersatz oder muss ich hässliche Kommentare verwenden?
Antworten:
Sie können verwenden // MARK:
Es wurde auch diskutiert, dass die liberale Verwendung von Klassenerweiterungen ohnehin eine bessere Praxis sein könnte. Da Erweiterungen Protokolle implementieren können, können Sie z. B. alle Delegierungsmethoden für Ihre Tabellenansicht in eine Erweiterung einfügen und Ihren Code auf einer semantischeren Ebene gruppieren, als dies möglich #pragma mark
ist.
// MARK:
, // TODO:
und // FIXME
in Swift Quelle und listet sie in den Sprungbalken. (Übrigens hat es bereits in (Obj) C-Quelle getan - #pragma mark
ist nicht der einzige Weg.) Und ja, Sie können immer noch -
Ihre hinzufügen MARK
, um Trennzeichen in das Menü aufzunehmen.
MARK
wenn Sie jetzt arbeiten, kann die Verwendung von Erweiterungen zum Gruppieren einiger Arten von semantisch verwandtem Code (insbesondere Protokollimplementierungen) immer noch nützlich sein. IMHO liest es sich viel besser, wenn Sie Ihre Protokollkonformitätserklärung direkt neben den Methoden haben, die sie implementieren, nicht 5 Protokolldeklarationen oben in der Datei und 50 verwandte Methodenimplementierungen, die zufällig irgendwo darunter verteilt sind.
#pragma mark
. // MARK: -
ist nur ein Trennzeichen, // MARK: - stuff
gibt Ihnen ein Trennzeichen und eine Überschrift und // MARK: - stuff -
gibt Ihnen ein Trennzeichen, eine Überschrift und ein weiteres Trennzeichen in einer Kommentarzeile.
Bis Xcode 5 existierte die Präprozessor-Direktive #pragma mark
.
Ab Xcode 6 müssen Sie verwenden // MARK:
Diese Präprozessorfunktionen ermöglichen es, dem Funktions-Dropdown-Feld des Quellcode-Editors eine gewisse Struktur zu verleihen.
einige Beispiele :
// MARK:
-> wird ein horizontaler Teiler vorangestellt
// MARK: your text goes here
-> setzt "Ihr Text geht hierher" in Fettdruck in die Dropdown-Liste
// MARK: - your text goes here
-> setzt "Ihr Text geht hierher" in Fettdruck in die Dropdown-Liste, gefolgt von einem horizontalen Teiler
Update: Screenshot hinzugefügt, da einige Leute immer noch Probleme damit haben:
// MARK: - text
für mich verwendet werden. Die Dropdown-Liste zeigt MARK: Text anstelle von nur Text .
Für diejenigen, die an der Verwendung von Erweiterungen im Vergleich zu Pragma-Zeichen interessiert sind (wie im ersten Kommentar erwähnt), ist hier die folgende Implementierung von einem Swift Engineer:
import UIKit
class SwiftTableViewController: UITableViewController {
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension SwiftTableViewController {
override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
return 1
}
override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
return 5
}
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
let cell = tableView?.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as UITableViewCell;
cell.textLabel.text = "Hello World"
return cell
}
}
Es ist auch nicht unbedingt die beste Vorgehensweise, aber so machen Sie es, wenn Sie möchten.
typealias
. Zum Beispiel typealias DataSource = SwiftTableViewController
. Dannextension Datasource {}
UITableViewController
ist kein Protokoll, es ist eine Klasse. Sie meinen wahrscheinlich UITableViewControllerDataSource
, aber dies ist nicht das im Beispiel verwendete Muster.
extension
der Header nicht mit dem Protokoll versehen ist extension SwiftTableViewController : UITableViewController
. Es wäre besser lesbar zu sehen, warum Sie diese Erweiterung zur Klasse hinzugefügt haben.
extension SwiftTableViewController : UITableViewDelegate { .. }
undextension SwiftTableViewController : UITableViewDatasource { .. }
Pragma mark - [SOME TEXT HERE]
wurde in Objective-C verwendet, um mehrere Funktionen durch Zeilentrennung zu gruppieren .
In Swift können Sie dies mit erreichenMARK, TODO OR FIXME
ich. KENNZEICHEN : //MARK: viewDidLoad
Dadurch wird eine horizontale Linie mit Funktionen erstellt, die unter viewDidLoad gruppiert sind (siehe Abbildung 1).
ii. MACHEN : //TODO: - viewDidLoad
Dadurch wird die Funktion unter TODO gruppiert: - viewDidLoad- Kategorie (siehe Screenshot 2)
iii. FIXME: //FIXME - viewDidLoad
Dadurch wird die Funktion unter FIXME gruppiert: - viewDidLoad- Kategorie (siehe Screenshot 3)
Weitere Informationen finden Sie in dieser Apple-Dokumentation .
Apples offizielles Dokument zur Xcode- Sprungleiste : Fügen Sie der Sprungleiste Code-Anmerkungen hinzu
!!!:
und ???:
manchmal können nicht angezeigt werden.
In Objective-C-Code erkennt Xcode Kommentare, // MARK: - foo
die etwas portabler sind als #pragma
. Aber diese scheinen (noch?) Auch nicht aufgegriffen zu werden.
Bearbeiten: In Xcode 6 Beta 4 behoben.
// MARK: -
momentan nicht funktioniert.
// MARK:
scheint nicht zu funktionieren. Ich habe es mit und ohne Leerzeichen versucht, mit und ohne Doppelpunkt, All-Caps und Mixed (Mark). Gibt es einen Trick? Muss ich eine Voreinstellung aktivieren oder so?
Ich denke, es Extensions
ist ein besserer Weg als #pragma mark
.
Der Code vor der Verwendung Extensions
:
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
...
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
...
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
...
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
...
}
}
Der Code nach der Verwendung von Extensions
:
class ViewController: UIViewController {
...
}
extension ViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
...
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
...
}
}
extension ViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
...
}
}
extension
allein im Dropdown-Menü der Breadcrumb-Steuerung von Xcode nicht wirklich auffällt.
Xcode 8 behandelt es jetzt wie folgt und wird in der Methoden-Dropdown-Liste folgendermaßen angezeigt:
// ARK:
für mich in Xcode 8
!!!
und ???
Syntax scheint nicht auf Xcode 8.3.3 zu funktionieren ...
Mit einem Apple Engineer im Swift-Labor heute Morgen auf der WWDC bestätigt, dass es derzeit kein #pragma oder ähnliches gibt. Sie halten dies für einen Fehler und er wird bald eintreffen. Ich vermute also, dass es sich um Beta 2 handelt.
Wie auch immer, es ist auf dem Weg.
Xcode unterstützt jetzt die Markierungen // MARK:, // TODO: und // FIXME, um Ihren Code zu kommentieren und in der Sprungleiste aufzulisten
Verwenden
// MARK: SectionName
oder
// MARK: - SectionName
Dadurch wird eine Linie über der Pragma-Markierung angezeigt, wodurch die Lesbarkeit verbessert wird.
Zur Vereinfachung einfach hinzufügen
// MARK: - <#label#>
zu Ihren Code-Schnipsel.
Alternativer Weg -
Verwenden Sie es auf diese Weise
private typealias SectionName = ViewController
private extension SectionName {
// Your methods
}
Dadurch wird nicht nur eine Markierung hinzugefügt (genau wie bei einer Pragma-Markierung), sondern der Code wird auch gut getrennt.
//MARK
Format beschweren (kein Leerzeichen) und vorschlagen // MARK: (text)
( ein Leerzeichen zwischen //
und MARK, kein Leerzeichen zwischen MARK
und :
und ein Leerzeichen zwischen :
und dem Abschnittsnamen)
//# MARK: - Spinner Class Methods
Fügen Sie eine Zeile zwischen dem Doppelpunkt und Ihrer Beschreibung ein, um eine Trennlinie einzufügen. Dies hilft, Ihren Code noch besser zu organisieren. Der Code und der Screenshot oben verwenden den MARK-Kommentar mit einer Zeile.
Dies funktioniert nur mit dem MARK-Kommentar.
Sie könnten auch an Swift 4.2 / XCode 10- Compiler-Direktiven wie interessiert sein
#warning("Some string to display")
und
#error("Some error to display")
Es kann nützlich sein, wenn Sie wirklich nichts verpassen möchten.
Professionelle Programmierer müssen dieses Tag für guten Code verwenden. Es ist auch gut für die Teamarbeit.
// MARK: example Web Service start here
// TODO: example 1
// FIXME: Please change BASE url before live
Es ist leicht, eine solche Methode zu finden
In Xcode 11 wurde eine Minikarte hinzugefügt, die aktiviert werden kann Editor -> Minimap
.
Die Minikarte zeigt jeden Markentext zur schnellen Orientierung im Code an. Jede Marke ist wie geschrieben// MARK: Variables
//MARK:
scheint für mich in Xcode 6.3.2 nicht zu funktionieren. Dies habe ich jedoch getan, um es zum Laufen zu bringen :
1) Code:
import Cocoa
class MainWindowController: NSWindowController {
//MARK: - My cool methods
func fly() {
}
func turnInvisible() {
}
}
2) In der jump bar
scheint sich beim Hinzufügen des //MARK
: Kommentars nichts zu ändern . Wenn ich jedoch auf den Namen ganz rechts in der Sprungleiste klicke, heißt es in meinem Fall MainWindowController(with a leading C icon)
, wird ein Popup-Fenster mit den Auswirkungen des Kommentars // MARK: angezeigt, nämlich eine Überschrift mit der Aufschrift "Meine coolen Methoden":
3) Ich stelle auch fest, dass, wenn ich auf eine der Methoden in meinem Code klicke, die Methode zum Eintrag ganz rechts in der Sprungleiste wird. Um MainWindowController(with a leading C icon)
der Eintrag ganz rechts in der Sprungleiste zu sein, muss ich auf das Leerzeichen über meinen Methoden klicken.
Apple gibt in der neuesten Version von Building Cocoa Apps an :
Der Swift-Compiler enthält keinen Präprozessor. Stattdessen werden Attribute zur Kompilierungszeit, Build-Konfigurationen und Sprachfunktionen verwendet, um dieselbe Funktionalität zu erzielen. Aus diesem Grund werden Präprozessoranweisungen nicht in Swift importiert.
Das # -Zeichen scheint immer noch so zu sein, wie Sie mit verschiedenen Build-Konfigurationen und ähnlichen Dingen arbeiten, aber es sieht so aus, als würden sie versuchen, Ihren Bedarf an Vorverarbeitung im Sinne von Pragma zu verringern und Sie insgesamt an andere Sprachfunktionen weiterzuleiten. Vielleicht soll dies dazu beitragen, dass die Spielplätze und die REPL so nah wie möglich am vollständig kompilierten Code sind.
Hinzufügen eines Aufgabenelements: Fügen Sie einen Kommentar mit dem Präfix TODO: ein. Zum Beispiel: // TODO: [Ihr Aufgabenelement].
Hinzufügen einer Bugfix-Erinnerung: Fügen Sie einen Kommentar mit dem Präfix FIXME: ein. Zum Beispiel: // FIXME: [Ihre Fehlerbehebungserinnerung].
Überschrift hinzufügen: Fügen Sie einen Kommentar mit dem Präfix MARK: ein. Zum Beispiel: // MARK: [Ihre Abschnittsüberschrift].
Trennlinie hinzufügen: Um ein Trennzeichen über einer Anmerkung hinzuzufügen, fügen Sie vor dem Kommentarteil der Anmerkung einen Bindestrich (-) ein. Zum Beispiel: // MARK: - [Ihr Inhalt]. Um ein Trennzeichen unter einer Anmerkung hinzuzufügen, fügen Sie nach dem Kommentarteil der Anmerkung einen Bindestrich (-) ein. Zum Beispiel: // MARK: [Ihr Inhalt] -.
Versuche dies:
// MARK: Reload TableView
func reloadTableView(){
tableView.reload()
}
Pragma Mark ist eine Möglichkeit, die Lesbarkeit Ihres Codes zu verbessern. Die Pragma-Kommentare werden wie Tags in der Xcode-Sprungleiste angezeigt.
//MARK: <Your comment goes here>
Beispiel: Im Code
//MARK: Properties
// MARK: View Life cycle
//MARK: Helper methods
So würde es in der Xcode-Sprungleiste erscheinen.