# Pragma in Swift?

936

In Ziel C kann ich #pragma markAbschnitte 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?

Arbitur
quelle
15
Es ist wirklich wichtig, unseren langen Code zu organisieren.
iPatel
Es scheint, dass es keinen schnell sichtbaren Unterschied mehr zwischen Kommentaren und Abschnittsmarkierungen gibt. Erweiterungen werden nicht benannt, daher scheinen separate Dateien die einzige Möglichkeit zu sein, zwischen den beiden Arten von Kommentaren zu unterscheiden
Stephen J
1
Sie können dies überprüfen: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey
1
Für andere Swift- und Xcode-Neulinge erwähne ich nur, dass der "Symbolnavigator", von dem alle sprechen, einer ist, den Sie erhalten, wenn Sie auf das am weitesten rechts stehende Element in der "Sprungleiste" oben im Bearbeitungsfenster klicken. Es ist nicht der Symbolnavigator im linken Bereich.
RenniePet
1
@HarshilKotecha Swift ist eine Programmiersprache, die von der Plattform unabhängig ist, auf der sie ausgeführt wird. Pragma Mark ist Teil von Swift und kann unter Linux, MacOS und anderen Apple-Plattformen einschließlich iOS verwendet werden. Es wäre lächerlich, diese Frage mit einer dieser Plattformen zu kennzeichnen, da das Pragma-Zeichen ein Merkmal von Swift selbst ist, nicht der Plattform. iOS ist nur eine der vielen Plattformen, auf denen Swift ausgeführt wird. Das ist wichtig zu verstehen. Diese Frage bezieht sich nicht auf iOS und auch nicht auf Linux oder MacOS. Es geht um Swift.
Eric Aya

Antworten:

1202

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 markist.

Frank Schmitt
quelle
64
Und ja, die neue Entwicklervereinbarung lässt uns über dieses Zeug sprechen :)
Frank Schmitt
4
Sie können keine Erweiterungen verwenden, um ein Protokoll mit einer Init-Methode wie NSCoding zu speichern. Das macht es schwierig zu trennen, wenn Sie es nicht in allen Fällen verwenden können.
Matthew Knippen
149
Ab beta 4, Xcode 6 erkennt // MARK:, // TODO:und // FIXMEin Swift Quelle und listet sie in den Sprungbalken. (Übrigens hat es bereits in (Obj) C-Quelle getan - #pragma markist nicht der einzige Weg.) Und ja, Sie können immer noch -Ihre hinzufügen MARK, um Trennzeichen in das Menü aufzunehmen.
Rickster
17
+1 für die Empfehlung von Erweiterungen. Selbst MARKwenn 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.
Rickster
37
@StevenKramer: Genauso wie bei #pragma mark. // MARK: -ist nur ein Trennzeichen, // MARK: - stuffgibt Ihnen ein Trennzeichen und eine Überschrift und // MARK: - stuff -gibt Ihnen ein Trennzeichen, eine Überschrift und ein weiteres Trennzeichen in einer Kommentarzeile.
Rickster
174

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:

Geben Sie hier die Bildbeschreibung ein

Ronny Webers
quelle
1
In XCode 6.1.1 gibt es keine Trennzeichen, die // MARK: - textfür mich verwendet werden. Die Dropdown-Liste zeigt MARK: Text anstelle von nur Text .
Mostruash
funktioniert gut für mich in Xcode 6.1.1, ich habe gerade einen Screenshot hinzugefügt - bitte überprüfen Sie mit Ihrem Code?
Ronny Webers
Ich habe vergessen zu erwähnen, dass ich es für Objective-C-Dateien versucht habe. Ich stimme für die Mühe, danke.
Mostruash
1
Ich verstehe, jetzt ist es klar :-) Die erste Frage fragt nach Swift, also habe ich nicht daran gedacht. Der Vollständigkeit halber : In Objective-C können Sie dasselbe tun, indem Sie Folgendes verwenden: # Pragma-Markierung - Ihr Markierungstext wird hier angezeigt , oder nur # Pragma-Markierung - wenn Sie einen Balken benötigen, oder # Pragma-Markierung Ihr Markierungstext wird hier angezeigt , um dasselbe zu erhalten ohne Bar. (Entschuldigung, ich kann das Markup für die Codefragmente nicht korrekt erhalten, ich habe sie fett gedruckt)
Ronny Webers
Es hat sich ein wenig in Xcode 8.1 geändert, aber diese Regel funktioniert im Allgemeinen.
Bevorzugen Sie
167

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.

NatashaTheRobot
quelle
6
Das ist sehr cool, aber es wäre schön, wenn Erweiterungen Namen haben könnten.
Matthew Knippen
16
@ Matthew - Sie könnten verwenden typealias. Zum Beispiel typealias DataSource = SwiftTableViewController. Dannextension Datasource {}
Logan
1
@PhongLe UITableViewControllerist kein Protokoll, es ist eine Klasse. Sie meinen wahrscheinlich UITableViewControllerDataSource, aber dies ist nicht das im Beispiel verwendete Muster.
KPM
4
Ich frage mich nur, warum extensionder 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.
Holex
7
Beachten Sie, dass Sie die Erweiterung benennen können , wenn Ihre Erweiterung nur als Protokollimplementierung vorhanden ist : extension SwiftTableViewController : UITableViewDelegate { .. }undextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis
117

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).

Screenshot 1

ii. MACHEN : //TODO: - viewDidLoad

Dadurch wird die Funktion unter TODO gruppiert: - viewDidLoad- Kategorie (siehe Screenshot 2)

Screenshot 2

iii. FIXME: //FIXME - viewDidLoad

Dadurch wird die Funktion unter FIXME gruppiert: - viewDidLoad- Kategorie (siehe Screenshot 3)

Screenshot 3

Weitere Informationen finden Sie in dieser Apple-Dokumentation .

Jayprakash Dubey
quelle
Beachten Sie, dass das "-" nach TODO und FIXME nichts bewirkt. Das "-" ist nur für die MARK-Richtlinie relevant.
Rismay
1
Außerdem wird eine große, großgeschriebene Abschnittsüberschrift im Code "Minikarte" erstellt, die Sie auf der rechten Seite einer Quelldatei anzeigen können. Ziemlich praktisch.
Oscar
66

Offizielle Dokumentation

Apples offizielles Dokument zur Xcode- Sprungleiste : Fügen Sie der Sprungleiste Code-Anmerkungen hinzu

Screenshots der Sprungleiste für Beispielcode

Beispielcode

Verhalten in Xcode 10.1 und macOS 10.14.3 (Mojave)

Xcode 10.1 und macOS 10.14.3

Verhalten in Xcode 10.0 und macOS 10.13.4 (High Sierra)

Xcode 10.0 und macOS 10.13.4

Verhalten in Xcode 9.4.1 und macOS 10.13.0

Xcode 9.4.1 und macOS 10.13.0

Diskussion

!!!:und ???:manchmal können nicht angezeigt werden.

George
quelle
!!!: und ???: Syntax funktioniert nicht mit Xcode 11.3.1
Jayprakash Dubey
56

In Objective-C-Code erkennt Xcode Kommentare, // MARK: - foodie etwas portabler sind als #pragma. Aber diese scheinen (noch?) Auch nicht aufgegriffen zu werden.

Bearbeiten: In Xcode 6 Beta 4 behoben.

Nikolai Ruhe
quelle
6
Ich hoffe sehr, dass sie es bald zur Verfügung stellen, weil ich gerne alles mit Pragma-Zeichen organisiert habe>. <
Arbitur
1
Ich kann bestätigen, dass dies // MARK: -momentan nicht funktioniert.
Rui Peres
Funktioniert nicht, aber der Beispielcode ist mit diesem Kommentarstil übersät, sodass er irgendwann aufgegriffen werden sollte.
Nate Cook
1
Ist es wichtig, dass der Kommentar portabel ist? Da die direkte Portierung eines Swift- Codes in eine andere Sprache für Entwickler bereits eine Herausforderung darstellt.
Holex
Hmmm, ich sehe viele Leute, die kommentieren, dass es funktioniert, aber ich bin in der Beta 6 und // 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?
Olie
37

Ich denke, es Extensionsist 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) {
       ...
    }
}
jqgsninimo
quelle
6
Ich denke, sein Potenzial ist weit mehr als Pragmas, aber zu diesem Zeitpunkt sind Pragmas immer noch besser, da die Erweiterung keine Protokollnamen oder benutzerdefinierten Namen im Dropdown-Menü anzeigt, wie dies bei Pragmas der Fall ist ( siehe unten Whasssaaahhhs Antwort )
nacho4d
Der neue Code "// MARK:" ist nützlich, aber ich mag auch Ihr klares Beispiel für die Verwendung von Erweiterungen - insbesondere für Delegatenfunktionen!
ElmerCat
Erweiterungen beschränken auch, was Sie tun können - z. B. keine gespeicherten Eigenschaften
Confused Vorlon
1
Ich benutze beides, weil das extensionallein im Dropdown-Menü der Breadcrumb-Steuerung von Xcode nicht wirklich auffällt.
Nicolas Miari
36

Xcode 8 behandelt es jetzt wie folgt und wird in der Methoden-Dropdown-Liste folgendermaßen angezeigt:

Geben Sie hier die Bildbeschreibung ein

Antoine
quelle
was ist mit MARK :? Es zeigt sich wie // ARK: für mich in Xcode 8
fnc12
Überprüfen Sie Ihren Code. Möglicherweise verwenden Sie einige Unicode-Zeichen über Ihrer // MARK: -Zeile. Aus irgendeinem Grund wird xcode verwirrt (und weil es scheiße ist) und kann damit nicht umgehen.
Carlos_ms
3
Die !!!und ???Syntax scheint nicht auf Xcode 8.3.3 zu funktionieren ...
Chris Frederick
@ ChrisFrederick Even !!! und ??? scheint nicht an Xocde 11.3.1 zu arbeiten
Jayprakash Dubey
34

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

Daniel
quelle
6
Beta 2, hat es noch nicht
Cescofry
Seltsam. Funktioniert bei mir ganz gut. PS: Aktualisiere deinen Xcode.
Daniel
@ Daniel: Welche Version von Xcode? Ich verwende Xcode 6.4 und arbeite anscheinend nicht daran.
Jayprakash Dubey
19

#pragma_markIn Swift können drei Optionen hinzugefügt werden :

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Hinweis: Wird -zum Hinzufügen von Trennzeichen verwendet

Jaydip
quelle
17

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.

Nikhil Manapure
quelle
1
Wenn Sie Swiftlint verwenden , wird es sich über das //MARKFormat beschweren (kein Leerzeichen) und vorschlagen // MARK: (text)( ein Leerzeichen zwischen //und MARK, kein Leerzeichen zwischen MARKund :und ein Leerzeichen zwischen :und dem Abschnittsnamen)
Nicolas Miari
2
@NicolasMiari, Danke, ich habe nach deinem Vorschlag bearbeitet. Und ich werde auch versuchen, SwiftLint für das nächste Projekt zu verwenden. :)
Nikhil Manapure
13
//# 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.

  1. // # MARK: - Textmethoden (LINE)
  2. // # MARK: Textmethoden (NO LINE)

Dies funktioniert nur mit dem MARK-Kommentar.

Geben Sie hier die Bildbeschreibung ein

aashish tamsya
quelle
12

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.

Geben Sie hier die Bildbeschreibung ein

wenige Codezeilen
quelle
Cool. Ich werde andere Teamkollegen warnen, wenn der Pfadfinder gegen die Regel verstößt.
Sazzad Hissain Khan
9

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

Es ist leicht, eine solche Methode zu finden

Harshil Kotecha
quelle
6

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

Geben Sie hier die Bildbeschreibung ein

Marek Baláž
quelle
5

//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 barscheint 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":

Geben Sie hier die Bildbeschreibung ein

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.

7stud
quelle
Ist es nicht so, wie es sein soll? Dass Sie auf die obere Leiste klicken müssen?
Arbitur
3

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.

UtopiaLtd
quelle
0

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] -.

Hiren
quelle
0

Versuche dies:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}
Nirbhay Singh
quelle
0

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.

Geben Sie hier die Bildbeschreibung ein

varunrathi28
quelle
Sie müssen sie nur an den richtigen Stellen in Ihre Datei einfügen.
Varunrathi28