#pragma mark dans Swift?

935

Dans l'Objectif C, je peux utiliser #pragma markpour marquer des sections de mon code dans le navigateur de symboles. Comme il s'agit d'une commande de préprocesseur C, elle n'est pas disponible dans Swift. Y a-t-il un remplaçant pour cela dans Swift, ou dois-je utiliser des commentaires laids?

Arbitur
la source
15
C'est vraiment important pour organiser notre code long.
iPatel
Il semble qu'il n'y ait plus de différence rapidement visible entre les commentaires et les marquages ​​de section. Les extensions ne sont pas nommées, donc des fichiers séparés semblent être le seul moyen de délimiter entre les deux types de commentaires
Stephen J
1
Vous pouvez vérifier celui-ci: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey
1
Pour les autres débutants Swift et Xcode, je mentionnerai simplement que le "navigateur de symboles" dont tout le monde parle est celui que vous obtenez lorsque vous cliquez sur la chose la plus à droite dans la "barre de saut" en haut de la fenêtre d'édition. Ce n'est pas le navigateur de symboles dans le panneau de gauche.
RenniePet
1
@HarshilKotecha Swift est un langage de programmation indépendant de la plate-forme sur laquelle il fonctionne. La marque Pragma fait partie de Swift et peut être utilisée sur Linux, macOS et d'autres plates-formes Apple, y compris iOS. Il serait ridicule d'étiqueter cette question avec l'une de ces plates-formes car la marque pragma est une caractéristique de Swift elle-même, pas de la plate-forme. iOS n'est qu'une des nombreuses plateformes sur lesquelles Swift fonctionne. C'est important à comprendre. Cette question ne concerne pas iOS et ne concerne pas non plus Linux ou macOS. Il s'agit de Swift.
Eric Aya

Réponses:

1202

Vous pouvez utiliser // MARK:


Il a également été discuté que l'utilisation libérale des extensions de classe pourrait être une meilleure pratique de toute façon. Étant donné que les extensions peuvent implémenter des protocoles, vous pouvez, par exemple, mettre toutes vos méthodes de délégué de vue de table dans une extension et regrouper votre code à un niveau plus sémantique que ce qui #pragma markest possible.

Frank Schmitt
la source
64
Et oui, le nouvel accord de développeur nous permet de parler de tout ça :)
Frank Schmitt
4
Vous ne pouvez pas utiliser d'extensions pour contenir un protocole qui a une méthode init, comme NSCoding. Cela rend difficile la séparation si vous ne pouvez pas l'utiliser dans tous les cas.
Matthew Knippen
149
A partir de bêta 4, 6 Xcode reconnaît // MARK:, // TODO:et // FIXMEdans la source Swift et les présente dans la barre de saut. (BTW, il l'a déjà fait dans (Obj) C source - ce #pragma markn'est pas le seul moyen.) Et oui, vous pouvez toujours ajouter -à votre MARKpour mettre des séparateurs dans le menu.
rickster
17
+1 pour recommander des extensions. Même en MARKtravaillant maintenant, l'utilisation d'extensions pour regrouper certains types de code sémantiquement lié (en particulier les implémentations de protocoles) peut toujours être utile. À mon humble avis, il est beaucoup mieux d'avoir votre déclaration de conformité de protocole juste à côté des méthodes qui l'implémentent, pas 5 déclarations de protocole en haut du fichier et 50 implémentations de méthodes connexes dispersées de manière aléatoire quelque part en dessous.
rickster
37
@StevenKramer: De la même manière qu'avec #pragma mark. // MARK: -est juste un séparateur, // MARK: - stuffvous donne un séparateur et un en-tête, et // MARK: - stuff -vous donne un séparateur, un en-tête et un autre séparateur tout en une seule ligne de commentaire.
rickster
174

Jusqu'à Xcode 5, la directive du préprocesseur #pragma markexistait.

A partir de Xcode 6, vous devez utiliser // MARK:

Ces fonctionnalités de préprocesseur permettent d'apporter une certaine structure à la liste déroulante des fonctions de l'éditeur de code source.

quelques exemples :

// MARK:

-> sera précédé d'un séparateur horizontal

// MARK: your text goes here

-> met 'votre texte va ici' en gras dans la liste déroulante

// MARK: - your text goes here

-> met 'votre texte va ici' en gras dans la liste déroulante, précédé d'un séparateur horizontal

mise à jour: capture d'écran ajoutée, car certaines personnes semblent toujours avoir des problèmes avec ceci:

entrez la description de l'image ici

Ronny Webers
la source
1
Il n'y a pas de séparateurs dans XCode 6.1.1 utilisant // MARK: - textpour moi et la liste déroulante affiche MARK: texte au lieu de simplement du texte .
mostruash
fonctionne bien pour moi dans Xcode 6.1.1, je viens d'ajouter une capture d'écran - veuillez vérifier avec votre code?
Ronny Webers
J'ai oublié de mentionner que je l'ai essayé pour les fichiers Objective-C. Voter pour l'effort cependant, merci.
mostruash
1
Je vois, maintenant c'est clair :-) La question initiale concerne Swift donc je n'y ai pas pensé. Pour être complet: dans Objective-C, vous pouvez faire la même chose en utilisant: #pragma mark - Votre texte de marqueur va ici , ou juste #pragma mark - si vous avez besoin d'une barre, ou #pragma mark Votre texte de marqueur va ici pour obtenir la même chose sans bar. (désolé, je ne peux pas obtenir le balisage correct pour les fragments de code, je les ai mis en gras)
Ronny Webers
Cela a un peu changé dans Xcode 8.1, mais cette règle fonctionne généralement, préférez cette réponse au mieux: D
windound
167

Pour ceux qui souhaitent utiliser des extensions par rapport aux marques pragma (comme mentionné dans le premier commentaire), voici comment l'implémenter à partir d'un ingénieur Swift:

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
    }

}

Ce n'est pas non plus nécessairement la meilleure pratique, mais c'est ainsi que vous le faites si vous le souhaitez.

NatashaTheRobot
la source
6
C'est très cool, mais ce serait bien si les extensions pouvaient avoir des noms.
Matthew Knippen
16
@Matthew - Vous pourriez utiliser typealias. Par exemple typealias DataSource = SwiftTableViewController. Ensuiteextension Datasource {}
Logan
1
@PhongLe UITableViewControllern'est pas un protocole, c'est une classe. Vous voulez probablement dire UITableViewControllerDataSource, mais ce n'est pas le modèle utilisé dans l'exemple.
KPM
4
Je me demande simplement pourquoi n'ont pas l'en extension-tête avec le protocole, comme extension SwiftTableViewController : UITableViewController, il serait plus lisible de voir pourquoi vous avez ajouté cette extension à la classe.
holex
7
Notez que si votre extension existe uniquement pour agir comme une implémentation de protocole, vous pouvez nommer l'extension: extension SwiftTableViewController : UITableViewDelegate { .. }etextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis
117

Pragma mark - [SOME TEXT HERE]a été utilisé dans Objective-C pour regrouper plusieurs fonctions par séparation de lignes.

Dans Swift, vous pouvez y parvenir en utilisantMARK, TODO OR FIXME

je. MARQUE : //MARK: viewDidLoad

Cela va créer une ligne horizontale avec des fonctions regroupées sous viewDidLoad (montré dans la capture d'écran 1)

Capture d'écran 1

ii. FAIRE : //TODO: - viewDidLoad

Cela regroupera la fonction sous TODO: - catégorie viewDidLoad (montré dans la capture d'écran 2)

Capture d'écran 2

iii. RÉPARE-MOI : //FIXME - viewDidLoad

Cela regroupera la fonction sous FIXME: - catégorie viewDidLoad (montré dans la capture d'écran 3)

Capture d'écran 3

Consultez cette documentation Apple pour plus de détails.

Jayprakash Dubey
la source
Notez que le "-" après TODO et FIXME ne fait rien. Le "-" ne concerne que la directive MARK.
rismay
1
Il crée également un grand en-tête de section en majuscule dans le code «mini-carte» que vous pouvez afficher le long du côté droit d'un fichier source. Assez pratique.
Oscar
66

Documentation officielle

Document officiel d'Apple sur Xcode Jump Bar: ajouter des annotations de code à la barre de saut

Captures d'écran de la barre de saut pour un exemple de code

Exemple de code

Comportement dans Xcode 10.1 et macOS 10.14.3 (Mojave)

Xcode 10.1 et macOS 10.14.3

Comportement dans Xcode 10.0 et macOS 10.13.4 (High Sierra)

Xcode 10.0 et macOS 10.13.4

Comportement dans Xcode 9.4.1 et macOS 10.13.0

Xcode 9.4.1 et macOS 10.13.0

Discussion

!!!:et ???:parfois ne peuvent pas être affichés.

George
la source
!!!: et ???: la syntaxe ne fonctionne pas sur Xcode 11.3.1
Jayprakash Dubey
56

Dans le code Objective-C, Xcode détecte des commentaires comme celui // MARK: - fooqui est un peu plus portable que #pragma. Mais ceux-ci ne semblent pas non plus être repris (encore?).

Edit: corrigé dans Xcode 6 beta 4.

Nikolai Ruhe
la source
6
J'espère bien qu'ils le rendront bientôt disponible parce que j'aime garder tout organisé avec des marques pragma>. <
Arbitur
1
Je peux confirmer que cela // MARK: -ne fonctionne pas pour le moment.
Rui Peres du
Ne fonctionne pas, mais l'exemple de code est jonché de ce style de commentaire, il devrait donc être récupéré éventuellement.
Nate Cook
1
est-il important que le commentaire soit portable? car le portage direct d' un code Swift vers une autre langue est déjà un défi pour les développeurs.
holex
Hmmm, je vois beaucoup de gens dire que cela fonctionne, mais je suis sur la Beta 6 et // MARK:ne semble pas fonctionner. J'ai essayé avec et sans l'espace, avec et sans les deux points, tout en majuscules et mixtes (Mark). Y a-t-il une astuce? Dois-je activer un pref ou quelque chose?
Olie
37

Je pense que Extensionsc'est une meilleure façon de le faire #pragma mark.

Le code avant d'utiliser 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) {
        ...
    }
}

Le code après utilisation 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
la source
6
Je pense que son potentiel est beaucoup plus important que les pragmas, mais à l'heure actuelle, les pragmas sont encore meilleurs car l'extension n'affiche pas les noms de protocole ou les noms personnalisés dans le menu déroulant comme le font les pragmas ( voir ci-dessous la réponse de Whasssaaahhh )
nacho4d
Le nouveau code "// MARK:" est utile, mais j'aime aussi votre exemple clair de la façon d'utiliser les extensions - en particulier pour les fonctions de délégué!
ElmerCat
les extensions limitent également ce que vous pouvez faire - par exemple, aucune propriété stockée
Confused Vorlon
1
J'utilise les deux, car le extensionseul ne se démarque pas vraiment dans le menu déroulant du contrôle du fil d'Ariane de Xcode.
Nicolas Miari
36

Xcode 8 le gère maintenant comme suit et apparaît comme ceci dans le menu déroulant de la méthode:

entrez la description de l'image ici

Antoine
la source
qu'en est-il de MARK:? Il montre comme // ARK: pour moi dans Xcode 8
fnc12
Vérifiez votre code, vous utilisez peut-être des caractères Unicode au-dessus de votre ligne // MARK :. Pour une raison quelconque, xcode est confus (et parce que ça craint), et ne peut pas gérer cela.
carlos_ms
3
La syntaxe !!!et ???ne semble pas fonctionner sur Xcode 8.3.3 ...
Chris Frederick
@ChrisFrederick Even !!! et ??? ne semble pas travailler sur Xocde 11.3.1
Jayprakash Dubey
34

Confirmé avec un ingénieur Apple dans le laboratoire Swift ce matin à la WWDC qu'il n'y a actuellement pas de #pragma ou équivalent pour le moment, ils considèrent cela comme un bug, et il arrivera bientôt, donc je suppose que la bêta 2, j'espère.

Quoi qu'il en soit, c'est en route.


Xcode prend désormais en charge les repères // MARK :, // TODO: et // FIXME pour annoter votre code et les répertorier dans la barre de saut

Daniel
la source
6
Beta 2, ne l'a pas encore
cescofry
Étrange. Fonctionne très bien pour moi. PS: mettez à jour votre Xcode.
Daniel
@Daniel: Quelle version de Xcode? J'utilise Xcode 6.4 et ne semble pas y travailler.
Jayprakash Dubey
19

Il y a trois options à ajouter #pragma_markdans Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Remarque: utilise -pour ajouter des séparateurs

Jaydip
la source
17

Utilisation

// MARK: SectionName

ou

// MARK: - SectionName

Cela donnera une ligne au-dessus de la marque pragma, la rendant plus lisible.

Pour plus de facilité, ajoutez simplement

// MARK: - <#label#>

à vos extraits de code.

Autre moyen -

Utilisez-le de cette façon

private typealias SectionName = ViewController
private extension SectionName  {
    // Your methods
}

Cela ajoutera non seulement une marque (tout comme la marque pragma) mais séparera également le code.

Nikhil Manapure
la source
1
Si vous utilisez Swiftlint , il se plaindra du //MARKformat (pas d'espace) et suggérera // MARK: (text)( un espace entre //et MARK, pas d'espace entre MARKet :, et un espace entre :et le nom de la section)
Nicolas Miari
2
@NicolasMiari, Merci, j'ai édité selon votre suggestion. Et essaiera également d'utiliser SwiftLint pour le prochain projet. :)
Nikhil Manapure
13
//# MARK: - Spinner Class Methods

Ajoutez une ligne entre les deux points et votre description pour insérer une ligne de séparation. Cela permet d'organiser encore plus votre code. Le code et la capture d'écran ci-dessus utilisent le commentaire MARK avec une ligne incluse.

  1. // # MARK: - Méthodes de texte (LINE)
  2. // # MARK: Méthodes de texte (PAS DE LIGNE)

Cela ne fonctionne qu'avec le commentaire MARK.

entrez la description de l'image ici

aashish tamsya
la source
12

Vous pouvez également être intéressé par les directives du compilateur Swift 4.2 / XCode 10 comme

#warning("Some string to display")

et

#error("Some error to display")

Cela peut être utile lorsque vous ne voulez vraiment rien manquer.

entrez la description de l'image ici

quelques lignes de code
la source
Cool. Je préviendrai les autres coéquipiers lorsque la règle du boy-scout violera.
Sazzad Hissain Khan
9

Le programmeur professionnel doit utiliser cette balise pour obtenir un bon code. C'est aussi bon pour le travail d'équipe.

// MARK: example Web Service start here
// TODO: example 1
// FIXME: Please change BASE url before live 

Il est facile de trouver une méthode comme celle-ci

Il est facile de trouver une méthode comme celle-ci

Harshil Kotecha
la source
6

Dans Xcode 11, ils ont ajouté une mini-carte qui peut être activée Editor -> Minimap.

La mini-carte affichera chaque texte de marque pour une orientation rapide dans le code. Chaque marque est écrite comme// MARK: Variables

entrez la description de l'image ici

Marek Baláž
la source
5

//MARK:ne semble pas fonctionner pour moi dans Xcode 6.3.2. Cependant, c'est ce que j'ai fait pour le faire fonctionner :

1) Code:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) Dans le jump barrien ne semble changer lors de l'ajout du //MARK: commentaire. Cependant, si je clique sur le nom le plus à droite dans la barre de saut, dans mon cas, il est dit MainWindowController(with a leading C icon), alors une fenêtre contextuelle s'affichera montrant les effets du commentaire // MARK:, à savoir un titre qui dit "Mes méthodes cool":

entrez la description de l'image ici

3) Je remarque également que si je clique sur l'une des méthodes de mon code, la méthode devient l'entrée la plus à droite dans la barre de saut. Pour arriver MainWindowController(with a leading C icon)à être l'entrée la plus à droite dans la barre de saut, je dois cliquer sur l'espace au-dessus de mes méthodes.

7stud
la source
N'est-ce pas ainsi que c'est censé être? Que vous devez cliquer sur la barre supérieure?
Arbitur
3

Apple déclare dans la dernière version de Building Cocoa Apps ,

Le compilateur Swift ne comprend pas de préprocesseur. Au lieu de cela, il tire parti des attributs au moment de la compilation, des configurations de génération et des fonctionnalités de langage pour accomplir la même fonctionnalité. Pour cette raison, les directives de préprocesseur ne sont pas importées dans Swift.

Le caractère # semble toujours être la façon dont vous travaillez avec diverses configurations de construction et des choses comme ça, mais il semble qu'ils essaient de réduire votre besoin de pré-traitement dans la veine de Pragma et de vous transmettre à d'autres fonctionnalités de langage. Peut-être est-ce pour aider au fonctionnement des Playgrounds et du REPL se comportant le plus près possible du code entièrement compilé.

UtopiaLtd
la source
0

Ajouter un élément à faire: insérer un commentaire avec le préfixe TODO :. Par exemple: // TODO: [votre tâche à faire].

Ajouter un rappel de correction de bogue: Insérez un commentaire avec le préfixe FIXME :. Par exemple: // FIXME: [votre rappel de correction de bogue].

Ajouter un en-tête: insérez un commentaire avec le préfixe MARK :. Par exemple: // MARK: [votre en-tête de section].

Ajouter une ligne de séparation: pour ajouter un séparateur au-dessus d'une annotation, ajoutez un trait d'union (-) avant la partie commentaire de l'annotation. Par exemple: // MARK: - [votre contenu]. Pour ajouter un séparateur sous une annotation, ajoutez un trait d'union (-) après la partie commentaire de l'annotation. Par exemple: // MARK: [votre contenu] -.

Hiren
la source
0

Essaye ça:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}
Nirbhay Singh
la source
0

La marque Pragma est un moyen d'améliorer la lisibilité de votre code. Les commentaires du pragma apparaîtront comme des balises sur la barre de saut Xcode.

//MARK:  <Your comment goes here>

Exemple: dans le code,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Voici comment cela apparaîtrait dans la barre de saut Xcode.

entrez la description de l'image ici

varunrathi28
la source
Il vous suffit de les insérer aux bons endroits de votre fichier.
varunrathi28