# marca de pragma en Swift?


935

En el Objetivo C, puedo usar #pragma markpara marcar secciones de mi código en el navegador de símbolos. Como se trata de un comando de preprocesador en C, no está disponible en Swift. ¿Hay un sustituto para esto en Swift, o tengo que usar comentarios feos?


15
Es realmente importante para organizar nuestro código largo.
iPatel

Parece que ya no hay una diferencia rápidamente visible entre los comentarios y las marcas de sección. Las extensiones no tienen nombre, por lo que los archivos separados parecen ser la única forma de delinear entre los dos tipos de comentarios
Stephen J


1
Para otros novatos de Swift y Xcode, solo mencionaré que el "navegador de símbolos" del que todo el mundo está hablando es uno que obtienes cuando haces clic en lo que está más a la derecha en la "barra de salto" en la parte superior de la ventana de edición. No es el navegador de símbolos en el panel izquierdo.
RenniePet

1
@HarshilKotecha Swift es un lenguaje de programación independiente de la plataforma en la que se ejecuta. La marca Pragma es parte de Swift y se puede usar en Linux, macOS y otras plataformas de Apple, incluido iOS. Sería ridículo etiquetar esta pregunta con cualquiera de estas plataformas porque la marca pragma es una característica del propio Swift, no de la plataforma. iOS es solo una de las muchas plataformas donde se ejecuta Swift. Esto es importante de entender. Esta pregunta no se trata de iOS, y tampoco se trata de Linux o macOS. Se trata de Swift.
Eric Aya

Respuestas:


1202

Puedes usar // MARK:


También se ha discutido que el uso liberal de las extensiones de clase podría ser una mejor práctica de todos modos. Dado que las extensiones pueden implementar protocolos, puede, por ejemplo, poner todos los métodos de delegado de vista de tabla en una extensión y agrupar su código a un nivel más semántico de lo que #pragma markes capaz.


64
Y sí, el nuevo acuerdo de desarrollador nos permite hablar sobre estas cosas :)
Frank Schmitt

44
No puede usar extensiones para mantener un protocolo que tiene un método init, como NSCoding. Eso hace que sea difícil de separar si no puede usarlo en todos los casos.
Matthew Knippen

149
A partir de la versión beta 4, Xcode 6 reconoce // MARK:, // TODO:y // FIXMEen Swift source y los enumera en la barra de salto. (Por cierto, ya lo hizo en la fuente (Obj) C, #pragma markno es la única forma). Y sí, todavía puede agregar -a su MARKpara poner separadores en el menú.
rickster

17
+1 para recomendar extensiones. Incluso con MARKtrabajar ahora, usar extensiones para agrupar algunos tipos de código semánticamente relacionado (especialmente implementaciones de protocolo) puede ser útil. En mi humilde opinión, se lee mucho mejor tener su declaración de conformidad de protocolo justo al lado de los métodos que lo implementan, no 5 declaraciones de protocolo en la parte superior del archivo y 50 implementaciones de métodos relacionados dispersos aleatoriamente en algún lugar a continuación.
rickster

37
@StevenKramer: de la misma manera que con #pragma mark. // MARK: -es solo un separador, // MARK: - stuffle brinda un separador y un encabezado, y // MARK: - stuff -le brinda un separador, un encabezado y otro separador, todo en una línea de comentario.
rickster

174

Hasta Xcode 5 #pragma markexistía la directiva de preprocesador .

A partir de Xcode 6, debes usar // MARK:

Estas características de preprocesador permiten aportar cierta estructura al cuadro desplegable de funciones del editor de código fuente.

algunos ejemplos :

// MARK:

-> estará precedido por un divisor horizontal

// MARK: your text goes here

-> pone 'su texto va aquí' en negrita en la lista desplegable

// MARK: - your text goes here

-> pone 'su texto va aquí' en negrita en la lista desplegable, precedido por un divisor horizontal

actualización: captura de pantalla agregada porque algunas personas todavía parecen tener problemas con esto:

ingrese la descripción de la imagen aquí


1
No hay separadores en XCode 6.1.1 // MARK: - textpara mí y la lista desplegable muestra MARK: texto en lugar de solo texto .
mostruash

funciona bien para mí en Xcode 6.1.1, acabo de agregar una captura de pantalla. ¿Comprueba tu código?
Ronny Webers

Olvidé mencionar que lo probé para archivos Objective-C. Sin embargo, votando por el esfuerzo, gracias.
mostruash

1
Ya veo, ahora está claro :-) La pregunta inicial es sobre Swift, así que no pensé en eso. Para completar: en Objective-C puede hacer lo mismo usando: #pragma mark - Su texto de marcador va aquí , o simplemente #pragma mark - si necesita una barra, o #pragma mark Su texto de marcador va aquí para obtener el mismo sin barra (lo siento, no puedo obtener el marcado correcto para los fragmentos de código, los puse en negrita)
Ronny Webers

Cambió un poco en Xcode 8.1, pero esta regla generalmente funciona, prefiera esta respuesta mejor: D
windsound

167

Para aquellos que estén interesados ​​en usar extensiones vs marcas de pragma (como se menciona en el primer comentario), a continuación se explica cómo implementarlo desde un ingeniero de 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
    }

}

Tampoco es necesariamente la mejor práctica, pero así es como lo haces si quieres.


66
Esto es muy bueno, pero sería bueno si las extensiones pudieran tener nombres.
Matthew Knippen

16
@Matthew: podrías usarlo typealias. Por ejemplo typealias DataSource = SwiftTableViewController. Entoncesextension Datasource {}
Logan

1
@PhongLe UITableViewControllerno es un protocolo, es una clase. Probablemente quieras decir UITableViewControllerDataSource, pero este no es el patrón utilizado en el ejemplo.
KPM

44
Me pregunto por qué no extensiontengo el encabezado con el protocolo, por ejemplo extension SwiftTableViewController : UITableViewController, sería más legible ver por qué agregaste esa extensión a la clase.
holex

77
Tenga en cuenta que si su extensión existe únicamente para actuar como una implementación de protocolo, puede nombrar la extensión: extension SwiftTableViewController : UITableViewDelegate { .. }yextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis

117

Pragma mark - [SOME TEXT HERE]se usó en Objective-C para agrupar varias funciones juntas separando líneas.

En Swift puedes lograr esto usandoMARK, TODO OR FIXME

yo. MARCA : //MARK: viewDidLoad

Esto creará una línea horizontal con funciones agrupadas en viewDidLoad (se muestra en la captura de pantalla 1)

Captura de pantalla 1

ii) QUE HACER : //TODO: - viewDidLoad

Esto agrupará la función en TODO: - categoría viewDidLoad (se muestra en la captura de pantalla 2)

Captura de pantalla 2

iii) ARREGLARME : //FIXME - viewDidLoad

Esto agrupará la función en FIXME: - categoría viewDidLoad (se muestra en la captura de pantalla 3)

Captura de pantalla 3

Consulte esta documentación de Apple para más detalles.


Observe que el "-" después de TODO y FIXME no hace nada. El "-" solo es relevante para la directiva MARK.
rismay

1
También crea un gran encabezado de sección en mayúscula en el código "minimapa" que puede mostrar en el lado derecho de un archivo fuente. Bastante práctico
Oscar

66

Documentación oficial

Documento oficial de Apple sobre Xcode Jump Bar: agregue anotaciones de código a la barra de salto

Capturas de pantalla de Jump Bar para código de muestra

Código de muestra

Comportamiento en Xcode 10.1 y macOS 10.14.3 (Mojave)

Xcode 10.1 y macOS 10.14.3

Comportamiento en Xcode 10.0 y macOS 10.13.4 (High Sierra)

Xcode 10.0 y macOS 10.13.4

Comportamiento en Xcode 9.4.1 y macOS 10.13.0

Xcode 9.4.1 y macOS 10.13.0

Discusión

!!!:y a ???:veces no se pueden mostrar.


!!!: y ???: la sintaxis no funciona en Xcode
11.3.1

56

En el código Objective-C, Xcode detecta comentarios como los // MARK: - fooque son un poco más portátiles que #pragma. Pero estos tampoco parecen ser recogidos (¿todavía?).

Editar: corregido en Xcode 6 beta 4.


66
Espero que lo hagan disponible pronto porque me gusta mantener todo organizado con marcas de pragma>. <
Arbitur

1
Puedo confirmar que // MARK: -no está funcionando por el momento.
Rui Peres

No funciona, pero el código de muestra está lleno de ese estilo de comentario, por lo que eventualmente debería ser recogido.
Nate Cook

1
¿Es importante que el comentario sea portátil? porque portar un código Swift a cualquier otro idioma directamente ya es un desafío para los desarrolladores.
holex

Hmmm, veo a muchas personas comentando que funciona, pero estoy en Beta 6 y // MARK:no parece estar funcionando. He intentado con y sin el espacio, con y sin el colon, mayúsculas y mixto (Mark). ¿Hay algún truco? ¿Necesito activar un pref o algo?
Olie

37

Creo que Extensionses una mejor manera en lugar de #pragma mark.

El código antes de usar 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) {
        ...
    }
}

El código después de usar 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) {
       ...
    }
}

66
Creo que su potencial es mucho más que los pragmas, pero en este momento los pragmas son aún mejores porque la extensión no muestra nombres de protocolo o nombres personalizados en el menú desplegable como lo hacen los pragmas ( ver la respuesta de Whasssaaahhh a continuación )
nacho4d

El nuevo código "// MARK:" es útil, pero también me gusta su claro ejemplo de cómo usar extensiones, ¡especialmente para las funciones de delegado!
ElmerCat

Las extensiones también limitan lo que puede hacer, por ejemplo, sin propiedades almacenadas
Vorlon confuso

1
Utilizo ambos, porque el extensionsolo no se destaca realmente en el menú desplegable del control de ruta de exploración de Xcode.
Nicolas Miari

36

Xcode 8 ahora lo maneja de la siguiente manera y se muestra así en el menú desplegable del método:

ingrese la descripción de la imagen aquí


¿Qué hay de MARK? Se muestra como // ARK: para mí en Xcode 8
fnc12

Verifique su código, podría estar usando algunos caracteres unicode sobre su // MARK: línea. Por alguna razón, xcode se confunde (y porque apesta), y no puede manejar eso.
carlos_ms

3
La sintaxis !!!y ???no parece estar funcionando en Xcode 8.3.3 ...
Chris Frederick

@ChrisFrederick Even !!! y ??? Dosen't parece estar trabajando en Xocde 11.3.1
Jayprakash Dubey

34

Confirmado con un ingeniero de Apple en el laboratorio Swift esta mañana en WWDC que actualmente no hay ningún #pragma o equivalente en este momento, lo consideran un error, y llegará pronto, así que supongo que beta 2, espero.

De todos modos, está en camino.


Xcode ahora admite // MARK :, // TODO: y // FIXME hitos para anotar su código y enumerarlos en la barra de salto


66
Beta 2, todavía no lo tiene
cescofry

Extraño. A mí me funciona bien. PD: actualiza tu Xcode.
Daniel

@Daniel: ¿Qué versión de Xcode? Estoy usando Xcode 6.4 y parece que no funciona.
Jayprakash Dubey

19

Hay tres opciones para agregar #pragma_marken Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Nota: Usos -para agregar separadores


17

Utilizar

// MARK: SectionName

o

// MARK: - SectionName

Esto dará una línea sobre la marca pragma, haciéndola más legible.

Para mayor comodidad solo agregue

// MARK: - <#label#>

a sus fragmentos de código.

Forma alternativa -

Úselo de esta manera

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

Esto no solo agregará la marca (al igual que la marca pragma) sino que también segregará el código muy bien.


1
Si usa Swiftlint , se quejará del //MARKformato (sin espacio) y sugerirá // MARK: (text)( un espacio entre //y MARK, sin espacio entre MARKy :, y un espacio entre :y el nombre de la sección)
Nicolas Miari

2
@NicolasMiari, gracias, he editado según su sugerencia. Y también intentaremos usar SwiftLint para el próximo proyecto. :)
Nikhil Manapure

13
//# MARK: - Spinner Class Methods

Agregue una línea entre los dos puntos y su descripción para insertar una línea de separación. Esto ayuda a organizar su código aún más. El código y la captura de pantalla anteriores hacen uso del comentario MARK con una línea incluida.

  1. // # MARK: - Métodos de texto (LINE)
  2. // # MARK: Métodos de texto (SIN LÍNEA)

Esto solo funciona con el comentario MARK.

ingrese la descripción de la imagen aquí


12

También te pueden interesar las directivas del compilador Swift 4.2 / XCode 10 como

#warning("Some string to display")

y

#error("Some error to display")

Puede ser útil cuando realmente no quieres perderte algo.

ingrese la descripción de la imagen aquí


Frio. Avisaré a otros compañeros de equipo cuando el boy scout infractor siga adelante.
Sazzad Hissain Khan

9

El programador profesional debe usar esta etiqueta para obtener un buen código. También es bueno para el trabajo en equipo.

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

Es fácil encontrar un método como este

Es fácil encontrar un método como este


6

En Xcode 11 agregaron un minimapa que se puede activar Editor -> Minimap.

El minimapa mostrará el texto de cada marca para una orientación rápida en el código. Cada marca está escrita como// MARK: Variables

ingrese la descripción de la imagen aquí


5

//MARK:no parece funcionar para mí en Xcode 6.3.2. Sin embargo, esto es lo que hice para que funcione :

1) Código:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) En la jump barnada parece cambiar al agregar el //MARK: comentario. Sin embargo, si hago clic en el nombre de la derecha en la barra de salto, en mi caso dice MainWindowController(with a leading C icon), aparecerá una ventana emergente que muestra los efectos del comentario // MARK: un encabezado que dice "Mis métodos geniales":

ingrese la descripción de la imagen aquí

3) También noto que si hago clic en uno de los métodos en mi código, entonces el método se convierte en la entrada más a la derecha en la barra de salto. Para llegar MainWindowController(with a leading C icon)a ser la entrada más a la derecha en la barra de salto, tengo que hacer clic en el espacio en blanco sobre mis métodos.


¿No es así como se supone que debe ser? ¿Que tienes que hacer clic en la barra superior?
Arbitur

3

Apple declara en la última versión de Building Cocoa Apps ,

El compilador Swift no incluye un preprocesador. En cambio, aprovecha los atributos en tiempo de compilación, las configuraciones de compilación y las características del lenguaje para lograr la misma funcionalidad. Por este motivo, las directivas de preprocesador no se importan en Swift.

Parece que el carácter # sigue siendo la forma en que trabaja con varias configuraciones de compilación y cosas por el estilo, pero parece que están tratando de reducir su necesidad de la mayor parte del preprocesamiento en la línea de pragma y remitirlo a otras funciones de lenguaje por completo. Quizás esto sea para ayudar en el funcionamiento de los Playgrounds y el REPL comportándose lo más cerca posible del código completamente compilado.


0

Agregue un elemento de tarea pendiente: inserte un comentario con el prefijo TODO :. Por ejemplo: // TODO: [su tarea pendiente].

Agregue un recordatorio de corrección de errores: inserte un comentario con el prefijo FIXME :. Por ejemplo: // FIXME: [su recordatorio de corrección de errores].

Agregue un encabezado: inserte un comentario con el prefijo MARK :. Por ejemplo: // MARK: [el encabezado de su sección].

Agregar una línea de separación: para agregar un separador sobre una anotación, agregue un guión (-) antes de la parte de comentario de la anotación. Por ejemplo: // MARK: - [su contenido]. Para agregar un separador debajo de una anotación, agregue un guión (-) después de la parte de comentario de la anotación. Por ejemplo: // MARK: [su contenido] -.


0

Prueba esto:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

0

La marca Pragma es una forma de mejorar la legibilidad de su código. Los comentarios de pragma aparecerían como etiquetas en la barra de salto Xcode.

//MARK:  <Your comment goes here>

Ejemplo: en el código,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Así es como aparecería en la barra de salto Xcode.

ingrese la descripción de la imagen aquí


Solo tiene que insertarlos en los lugares correctos de su archivo.
varunrathi28
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.