web-dev-qa-db-fra.com

#pragma mark à Swift?

En Objective C, je peux utiliser #pragma mark pour marquer des sections de mon code dans le navigateur de symboles. S'agissant d'une commande de préprocesseur C, elle n'est pas disponible dans Swift. Existe-t-il un remplaçant pour cela dans Swift ou dois-je utiliser des commentaires déplaisants?

900
Arbitur

Vous pouvez utiliser // MARK:


Il a également été discuté que l'utilisation libérale des extensions de classe pourrait de toute façon être une meilleure pratique. Les extensions pouvant implémenter des protocoles, vous pouvez par exemple placez toutes vos méthodes de délégation de vue table dans une extension et regroupez votre code à un niveau plus sémantique que ne le permet #pragma mark.

1158
Frank Schmitt

Pour ceux qui sont intéressés par l'utilisation d'extensions ou de marques pragma (comme mentionné dans le premier commentaire), voici comment l'implémenter à partir d'un 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
    }

}

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

166
NatashaTheRobot

Jusqu'au Xcode 5, la directive de préprocesseur #pragma mark existait.

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

Ces fonctionnalités du 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 diviseur 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

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

enter image description here

165
Ronny Webers

Pragma mark - [SOME TEXT HERE] a été utilisé dans Objective-C pour regrouper plusieurs fonctions en les séparant par une ligne.

En Swift , vous pouvez y parvenir en utilisant MARK, TODO OR FIXME

je. MARK: //MARK: viewDidLoad

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

Screenshot 1

ii. TODO: //TODO: - viewDidLoad

Cela regroupera les fonctions sous la catégorie TODO: - viewDidLoad (affichée dans la capture d'écran 2)

Screenshot 2

iii. FIXME: //FIXME - viewDidLoad

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

Screenshot 3

113
Jayprakash Dubey

En code Objective-C, Xcode détecte des commentaires tels que // MARK: - foo qui est un peu plus portable que #pragma. Mais ceux-ci ne semblent pas être pris en compte (encore?).

Edit: corrigé dans Xcode 6 beta 4.

56
Nikolai Ruhe

Documentation officielle

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

Jump Bar Captures d'écran pour Sample Code

Sample Code

Comportement dans Xcode 10.1 et macOS 10.14.3 (Mojave)

Xcode 10.1 and macOS 10.14.3

Comportement dans Xcode 10.0 et macOS 10.13.4 (High Sierra)

Xcode 10.0 and macOS 10.13.4

Comportement dans Xcode 9.4.1 et macOS 10.13.0

Xcode 9.4.1 and macOS 10.13.0

Discussion

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

47
George

Je pense que Extensions est un meilleur moyen que #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 avoir utilisé 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) {
       ...
    }
}
36
jqgsninimo

Xcode 8 le gère maintenant comme suit et apparaît comme ceci dans la liste déroulante des méthodes:

enter image description here

36
Antoine

Confirmé avec un Apple Engineer dans le laboratoire Swift de WWDC ce matin, qu'il n'y a actuellement aucun # pragma ou équivalent pour le moment, ils considèrent qu'il s'agit d'un bogue, et cela arrivera bientôt, je devine donc la beta 2, j'espère.

Quoi qu'il en soit, c'est sur le chemin.


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

34
Daniel

Il y a trois options pour ajouter #pragma_mark dans Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Remarque: Utilise - pour ajouter des séparateurs.

19
Jaydip

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.

17
Nikhil Manapure
//# MARK: - Spinner Class Methods

Ajoutez une ligne entre les deux points et votre description pour insérer une ligne de séparation. Cela aide à organiser votre code encore plus. 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 (AUCUNE LIGNE)

Cela ne fonctionne qu'avec le commentaire MARK.

enter image description here

13
aashish tamsya

Vous pouvez également être intéressé par les directives de compilation de Swift 4.2/XCode 10 telles que

#warning("Some string to display")

et

#error("Some error to display")

Cela peut être utile lorsque vous ne voulez vraiment pas rater quelque chose.

enter image description here

10
fewlinesofcode

Le programmeur professionnel doit utiliser cette balise pour obtenir un bon code. C'est aussi bon pour le travail en é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

It is easy to find method like this

9
Harshil Kotecha

//MARK: ne pas semble travailler 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 bar rien ne semble changer lors de l'ajout du commentaire //MARK:. Cependant, si je clique sur le nom le plus à droite de la barre de saut, dans mon cas, il indique MainWindowController(with a leading C icon), une fenêtre contextuelle apparaîtra affichant les effets du commentaire // MARK:, à savoir un en-tête "Mon style méthodes ":

enter image description here

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

5
7stud

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

Le compilateur Swift n'inclut pas de préprocesseur. Au lieu de cela, il tire parti des attributs de compilation, des configurations de construction et des fonctionnalités de langage pour réaliser la même fonctionnalité. Pour cette raison, les directives du préprocesseur ne sont pas importées dans Swift.

Le caractère # semble toujours être votre façon de travailler avec diverses configurations de construction et autres choses du même genre, mais il semblerait qu’ils essaient de réduire votre besoin de pré-traitement dans la veine de pragma et de vous renvoyer à d’autres fonctionnalités du langage. C’est peut-être pour faciliter le fonctionnement des Playgrounds et du REPL se comportant aussi près que possible du code entièrement compilé.

3
UtopiaLtd

Essaye ça:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}
0
Nirbhay Singh

Ajouter une tâche: Insérez un commentaire avec le préfixe TODO :. Par exemple: // TODO: [votre tâche].

Ajoutez 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érer un commentaire avec le préfixe MARK :. Par exemple: // MARK: [en-tête de votre 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] -.

0
Hiren