#pragma mark in Swift?


935

In Obiettivo C, posso usare #pragma markper contrassegnare sezioni del mio codice nel navigatore dei simboli. Poiché si tratta di un comando preprocessore C, non è disponibile in Swift. C'è uno stand-in per questo in Swift o devo usare brutti commenti?


15
È davvero importante per organizzare il nostro codice lungo.
iPatel

Sembra che non ci sia più una differenza rapidamente visibile tra commenti e segni di sezione. Le estensioni non hanno un nome, quindi file separati sembrano essere l'unico modo per delineare tra i due tipi di commenti
Stephen J

1
È possibile controllare questo: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey

1
Per gli altri neofiti di Swift e Xcode citerò solo che il "navigatore di simboli" di cui tutti parlano è quello che ottieni quando fai clic sulla cosa più a destra nella "barra di scorrimento" nella parte superiore della finestra di modifica. Non è il simbolo navigatore nel riquadro di sinistra.
RenniePet

1
@HarshilKotecha Swift è un linguaggio di programmazione indipendente dalla piattaforma su cui gira. Il marchio Pragma fa parte di Swift e può essere utilizzato su Linux, macOS e altre piattaforme Apple incluso iOS. Sarebbe ridicolo taggare questa domanda con una di queste piattaforme perché il pragma mark è una caratteristica di Swift stesso, non della piattaforma. iOS è solo una delle tante piattaforme su cui gira Swift. Questo è importante da capire. Questa domanda non riguarda iOS e nemmeno Linux o macOS. Riguarda Swift.
Eric Aya,

Risposte:


1202

Puoi usare // MARK:


Si è anche discusso del fatto che l'uso liberale delle estensioni di classe potrebbe comunque essere una pratica migliore. Poiché le estensioni possono implementare protocolli, è possibile ad esempio mettere tutti i metodi delegati della vista tabella in un'estensione e raggruppare il codice a un livello più semantico di quello che #pragma markè in grado di fare.


64
E sì, il nuovo accordo con gli sviluppatori ci consente di parlare di queste cose :)
Frank Schmitt,

4
Non è possibile utilizzare le estensioni per contenere un protocollo che ha un metodo init, come NSCoding. Ciò rende difficile separare se non è possibile utilizzarlo in tutti i casi.
Matthew Knippen,

149
A partire dal beta 4, Xcode 6 riconosce // MARK:, // TODO:e // FIXMEin fonte Swift e li elenca nella barra di scorrimento. (A proposito, lo ha già fatto nella fonte (Obj) C - #pragma marknon è l'unico modo.) E sì, puoi ancora aggiungere -al tuo MARKper mettere separatori nel menu.
rickster,

17
+1 per raccomandare le estensioni. Anche MARKlavorando ora, utilizzare le estensioni per raggruppare alcuni tipi di codice semanticamente correlato (in particolare le implementazioni del protocollo) può ancora essere utile. IMHO sembra molto meglio avere la tua dichiarazione di conformità del protocollo proprio accanto ai metodi che lo implementano, non 5 dichiarazioni di protocollo nella parte superiore del file e 50 implementazioni di metodi correlati sparse casualmente da qualche parte di seguito.
rickster,

37
@StevenKramer: allo stesso modo di #pragma mark. // MARK: -è solo un separatore, // MARK: - stuffti dà un separatore e un'intestazione e // MARK: - stuff -ti dà un separatore, un'intestazione e un altro separatore tutto in una riga di commento.
rickster

174

Fino a Xcode 5 #pragma markesisteva la direttiva preprocessore .

Da Xcode 6 in poi, devi usare // MARK:

Queste funzionalità del preprocessore consentono di portare una struttura nella casella a discesa della funzione dell'editor del codice sorgente.

qualche esempio :

// MARK:

-> sarà preceduto da un divisore orizzontale

// MARK: your text goes here

-> mette "il tuo testo va qui" in grassetto nell'elenco a discesa

// MARK: - your text goes here

-> mette "il tuo testo va qui" in grassetto nell'elenco a discesa, preceduto da un divisore orizzontale

aggiornamento: aggiunto screenshot perché alcune persone sembrano avere ancora problemi con questo:

inserisci qui la descrizione dell'immagine


1
Non ci sono separatori in XCode 6.1.1 che usano // MARK: - textper me e l'elenco a discesa mostra MARK: testo anziché solo testo .
mostruash,

funziona bene per me in Xcode 6.1.1, ho appena aggiunto uno screenshot - controlla con il tuo codice?
Ronny Webers,

Ho dimenticato di dire che l'ho provato per i file Objective-C. Votando per lo sforzo, grazie.
mostruash,

1
Capisco, ora è chiaro :-) La domanda iniziale è su Swift, quindi non ci ho pensato. Per completezza: in Objective-C puoi fare lo stesso usando: #pragma mark - Il testo del tuo marker va qui , o solo #pragma mark - se hai bisogno di una barra, o #pragma mark Il tuo testo del marker va qui per ottenere lo stesso senza bar. (scusa, non riesco a ottenere il markup corretto per i frammenti di codice, li ho messi in grassetto)
Ronny Webers

È cambiato un po 'in Xcode 8.1, ma questa regola generalmente funziona, preferisci questa risposta al meglio: D
windsound

167

Per coloro che sono interessati all'utilizzo delle estensioni rispetto ai segni pragma (come menzionato nel primo commento), ecco come implementarlo da un ingegnere 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
    }

}

Inoltre, non è necessariamente la migliore pratica, ma è così che lo fai se ti piace.


6
È molto bello, ma sarebbe bello se le estensioni potessero avere dei nomi.
Matthew Knippen,

16
@Matthew - Potresti usare typealias. Per esempio typealias DataSource = SwiftTableViewController. Quindiextension Datasource {}
Logan,

1
@PhongLe UITableViewControllernon è un protocollo, è una classe. Probabilmente intendi UITableViewControllerDataSource, ma questo non è il modello usato nell'esempio.
KPM,

4
Mi sto solo chiedendo perché non abbia extensionl'intestazione con il protocollo, come extension SwiftTableViewController : UITableViewController, sarebbe più leggibile vedere perché hai aggiunto l'estensione alla classe.
Holex,

7
Nota che se la tua estensione esiste solo per fungere da implementazione del protocollo, puoi nominare l'estensione: extension SwiftTableViewController : UITableViewDelegate { .. }eextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis

117

Pragma mark - [SOME TEXT HERE]è stato usato in Objective-C per raggruppare diverse funzioni per separazione delle righe.

In Swift puoi farlo usandoMARK, TODO OR FIXME

io. MARCHIO : //MARK: viewDidLoad

Questo creerà una linea orizzontale con funzioni raggruppate sotto viewDidLoad (mostrato nella schermata 1)

Schermata 1

ii. FARE : //TODO: - viewDidLoad

Questo raggrupperà le funzioni in TODO: - categoria viewDidLoad (mostrato nella schermata 2)

Schermata 2

iii. AGGIUSTAMI : //FIXME - viewDidLoad

Questo raggrupperà le funzioni in FIXME: - categoria viewDidLoad (mostrato nella schermata 3)

Schermata 3

Controlla questa documentazione di Apple per i dettagli.


Si noti che il "-" dopo TODO e FIXME non fanno nulla. Il "-" è rilevante solo per la direttiva MARK.
1616

1
Crea inoltre un'intestazione di sezione grande e maiuscola nel codice "minimappa" che è possibile visualizzare lungo il lato destro di un file di origine. Abbastanza utile.
Oscar

66

Documentazione ufficiale

Documento ufficiale di Apple sulla barra di salto Xcode: aggiungi annotazioni di codice alla barra di salto

Schermata Jump Bar per il codice di esempio

Codice di esempio

Comportamento in Xcode 10.1 e macOS 10.14.3 (Mojave)

Xcode 10.1 e macOS 10.14.3

Comportamento in Xcode 10.0 e macOS 10.13.4 (High Sierra)

Xcode 10.0 e macOS 10.13.4

Comportamento in Xcode 9.4.1 e macOS 10.13.0

Xcode 9.4.1 e macOS 10.13.0

Discussione

!!!:e a ???:volte non possono essere visualizzati.


!!!: e ???: la sintassi non funziona su Xcode 11.3.1
Jayprakash Dubey

56

Nel codice Objective-C Xcode rileva i commenti del tipo // MARK: - fooleggermente più portatile di #pragma. Ma anche questi non sembrano essere stati raccolti (ancora?).

Modifica: risolto in Xcode 6 beta 4.


6
Spero davvero che lo rendano presto disponibile perché mi piace mantenere tutto organizzato con i segni del pragma>. <
Arbitur

1
Posso confermare che // MARK: -per il momento non funziona.
Rui Peres,

Non funziona, ma il codice di esempio è disseminato di quello stile di commento, quindi dovrebbe essere raccolto alla fine.
Nate Cook,

1
è importante che il commento sia portatile? perché il porting di un codice Swift in qualsiasi altra lingua direttamente è già una sfida per gli sviluppatori.
Holex,

Hmmm, vedo molte persone che commentano che funziona, ma sono su Beta 6 e // MARK:sembra non funzionare. Ho provato con e senza lo spazio, con e senza i due punti, maiuscolo e misto (Mark). C'è un trucco? Devo attivare un pref o qualcosa del genere?
Olie,

37

Penso che Extensionssia un modo migliore invece di #pragma mark.

Il codice prima di utilizzare 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) {
        ...
    }
}

Il codice dopo aver usato 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) {
       ...
    }
}

6
Penso che il suo potenziale sia molto più che pragma, ma in questo momento i pragmi sono ancora migliori perché l'estensione non mostra i nomi dei protocolli o i nomi personalizzati nel menu a discesa come fanno i pragmi ( vedi sotto la risposta di Whasssaaahhh )
nacho4d

Il nuovo codice "// MARK:" è utile, ma mi piace anche il tuo chiaro esempio di come usare le estensioni, specialmente per le funzioni delegate!
ElmerCat,

le estensioni limitano anche ciò che puoi fare - ad es. nessuna proprietà memorizzata
Confuso Vorlon

1
Uso entrambi, perché il extensionsolo non si distingue nel menu a discesa del controllo breadcrumb di Xcode.
Nicolas Miari,

36

Xcode 8 ora lo gestisce come seguito e si presenta così nel menu a discesa del metodo:

inserisci qui la descrizione dell'immagine


che dire di MARK:? Mostra come // ARK: per me in Xcode 8
fnc12

Controlla il tuo codice, potresti usare alcuni caratteri unicode sopra la tua // MARK: line. Per qualche ragione xcode viene confuso (e perché fa schifo) e non può gestirlo.
carlos_ms,

3
La sintassi !!!e ???non sembra funzionare su Xcode 8.3.3 ...
Chris Frederick,

@ChrisFrederick Even !!! e ??? dosen't sembra funzionare su Xocde 11.3.1
Jayprakash Dubey

34

Confermato con un ingegnere Apple nel laboratorio Swift stamattina al WWDC che al momento non ci sono #pragma o equivalenti, lo considerano un bug e arriverà presto, quindi spero beta 2.

Comunque, sta arrivando.


Xcode ora supporta // MARK :, // TODO: e // FIXME landmarks per annotare il tuo codice ed elencarli nella barra di salto


6
Beta 2, non ce l'ha ancora
cescofry il

Strano. Funziona bene per me. PS: aggiorna il tuo Xcode.
Daniel,

@Daniel: quale versione di Xcode? Sto usando Xcode 6.4 e sembra non funzionare su di esso.
Jayprakash Dubey,

19

Esistono tre opzioni da aggiungere #pragma_markin Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Nota: utilizza -per aggiungere separatori


17

Uso

// MARK: SectionName

o

// MARK: - SectionName

Questo darà una linea sopra il segno del pragma, rendendolo più leggibile.

Per semplicità basta aggiungere

// MARK: - <#label#>

ai frammenti di codice.

Modo alternativo -

Usalo in questo modo

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

Questo non solo aggiungerà mark (proprio come il pragma mark) ma segregherà bene anche il codice.


1
Se usi Swiftlint , si lamenterà del //MARKformato (nessuno spazio) e suggerirà // MARK: (text)( uno spazio tra //e MARK, nessuno spazio tra MARKe :, e uno spazio tra :e il nome della sezione)
Nicolas Miari,

2
@NicolasMiari, grazie, ho modificato secondo il tuo suggerimento. E proverò anche a utilizzare SwiftLint per il prossimo progetto. :)
Nikhil Manapure,

13
//# MARK: - Spinner Class Methods

Aggiungi una linea tra i due punti e la descrizione per inserire una linea di separazione. Questo aiuta a organizzare ancora di più il tuo codice. Il codice e lo screenshot sopra fanno uso del commento MARK con una riga inclusa.

  1. // # MARK: - Metodi di testo (LINEA)
  2. // # MARK: Metodi di testo (NO LINE)

Funziona solo con il commento MARK.

inserisci qui la descrizione dell'immagine


12

Potresti essere interessato anche alle direttive del compilatore Swift 4.2 / XCode 10 come

#warning("Some string to display")

e

#error("Some error to display")

Potrebbe essere utile quando davvero non vuoi perderti qualcosa.

inserisci qui la descrizione dell'immagine


Freddo. Avvertirò altri compagni di squadra quando il violento boy scout regnerà in seguito.
Sazzad Hissain Khan,

9

Il programmatore professionista deve utilizzare questo tag per un buon codice. È anche buono per il lavoro di gruppo.

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

È facile trovare un metodo come questo

È facile trovare un metodo come questo


6

In Xcode 11 hanno aggiunto la minimappa che può essere attivata Editor -> Minimap.

La minimappa mostrerà il testo di ogni segno per un rapido orientamento nel codice. Ogni segno è scritto come// MARK: Variables

inserisci qui la descrizione dell'immagine


5

//MARK:non sembra funzionare per me in Xcode 6.3.2. Tuttavia, questo è quello che ho fatto per farlo funzionare :

1) Codice:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) Nel jump barnulla sembra cambiare quando si aggiunge il //MARK: commento. Tuttavia, se faccio clic sul nome più a destra nella barra di salto, nel mio caso si dice MainWindowController(with a leading C icon), verrà visualizzata una finestra popup che mostra gli effetti del // MARK: commento, vale a dire un'intestazione che dice "I miei metodi interessanti":

inserisci qui la descrizione dell'immagine

3) Noto anche che se faccio clic su uno dei metodi nel mio codice, il metodo diventa la voce più a destra nella barra di salto. Per MainWindowController(with a leading C icon)essere la voce più a destra nella barra di salto, devo fare clic sullo spazio bianco sopra i miei metodi.


Non è come dovrebbe essere? Che devi fare clic sulla barra in alto?
Arbitur,

3

Apple afferma nell'ultima versione di Building Cocoa Apps ,

Il compilatore Swift non include un preprocessore. Invece, sfrutta gli attributi in fase di compilazione, le configurazioni di compilazione e le funzionalità del linguaggio per ottenere la stessa funzionalità. Per questo motivo, le direttive del preprocessore non vengono importate in Swift.

Il personaggio # sembra essere ancora il modo in cui lavori con varie configurazioni di build e cose del genere, ma sembra che stiano cercando di ridurre la tua necessità di maggior preelaborazione nella vena del pragma e di inoltrarti ad altre funzionalità del linguaggio. Forse questo è di aiuto nel funzionamento dei Playgrounds e il REPL si comporta il più vicino possibile al codice completamente compilato.


0

Aggiungi un elemento da fare: inserisci un commento con il prefisso TODO :. Ad esempio: // TODO: [il tuo oggetto da fare].

Aggiungi un promemoria per la correzione di bug: inserisci un commento con il prefisso FIXME :. Ad esempio: // FIXME: [promemoria per la correzione di bug].

Aggiungi un'intestazione: inserisci un commento con il prefisso MARK :. Ad esempio: // MARK: [il titolo della tua sezione].

Aggiungi una linea di separazione: per aggiungere un separatore sopra un'annotazione, aggiungi un trattino (-) prima della parte di commento dell'annotazione. Ad esempio: // MARK: - [il tuo contenuto]. Per aggiungere un separatore sotto un'annotazione, aggiungi un trattino (-) dopo la parte di commento dell'annotazione. Ad esempio: // MARK: [il tuo contenuto] -.


0

Prova questo:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

0

Il marchio Pragma è un modo per migliorare la leggibilità del tuo codice. I commenti pragma apparirebbero come tag sulla barra di salto Xcode.

//MARK:  <Your comment goes here>

Esempio: nel codice,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Ecco come apparirebbe nella barra di salto di Xcode.

inserisci qui la descrizione dell'immagine


Devi solo inserirli nei punti corretti nel tuo file.
varunrathi28,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.