marca #pragma em Swift?


936

No Objetivo C, posso usar #pragma markpara marcar seções do meu código no navegador de símbolos. Como esse é um comando do pré-processador C, não está disponível no Swift. Existe um substituto para isso no Swift, ou eu tenho que usar comentários feios?


15
É realmente importante para organizar nosso código longo.
iPatel

Parece que não há mais uma diferença visível rapidamente entre comentários e marcações de seção. As extensões não são nomeados, de modo arquivos separados parecem ser a única maneira de delinear entre os dois tipos de comentários
Stephen J


1
Para outros iniciantes do Swift e do Xcode, mencionarei apenas que o "navegador de símbolos" de que todo mundo está falando é aquele que você obtém quando clica na coisa mais à direita na "barra de salto" na parte superior da janela de edição. Não é o navegador de símbolos no painel esquerdo.
RenniePet

1
@HarshilKotecha Swift é uma linguagem de programação independente da plataforma em que é executada. A marca Pragma faz parte do Swift e pode ser usada no Linux, macOS e outras plataformas da Apple, incluindo iOS. Seria ridículo marcar essa pergunta com qualquer uma dessas plataformas, porque a marca pragma é uma característica do próprio Swift, não da plataforma. O iOS é apenas uma das muitas plataformas em que o Swift é executado. Isso é importante para entender. Esta pergunta não é sobre iOS e também não é sobre Linux ou macOS. É sobre Swift.
Eric Aya

Respostas:


1202

Você pode usar // MARK:


Também se discutiu que o uso liberal de extensões de classe pode ser uma prática melhor de qualquer maneira. Como as extensões podem implementar protocolos, você pode, por exemplo, colocar todos os seus métodos de delegação de exibição de tabela em uma extensão e agrupar seu código em um nível mais semântico do que #pragma marké capaz.


64
E sim, o novo acordo desenvolvedor nos permite falar sobre essas coisas :)
Frank Schmitt

4
Você não pode usar extensões para armazenar um protocolo que possua um método init, como NSCoding. Isso dificulta a separação se você não puder usá-lo em todos os casos.
Matthew knippen

149
A partir da versão beta 4, o Xcode 6 reconhece // MARK:, // TODO:e // FIXMEna fonte Swift, e os lista na barra de salto. (BTW, ele já funcionou na fonte (Obj) C - #pragma marknão é a única maneira.) E sim, você ainda pode adicionar -ao seu MARKpara colocar separadores no menu.
Rickster

17
+1 para recomendar extensões. Mesmo MARKtrabalhando agora, o uso de extensões para agrupar alguns tipos de código semanticamente relacionado (especialmente implementações de protocolo) ainda pode ser útil. No IMHO, é muito melhor ter sua declaração de conformidade com o protocolo ao lado dos métodos que a implementam, não 5 declarações de protocolo na parte superior do arquivo e 50 implementações de método relacionadas, espalhadas aleatoriamente em algum lugar abaixo.
Rickster

37
@StevenKramer: Da mesma maneira que com #pragma mark. // MARK: -é apenas um separador, // MARK: - stufffornece um separador e um cabeçalho, além de // MARK: - stuff -um separador, um cabeçalho e outro separador, todos em uma linha de comentário.
Rickster

174

Até o Xcode 5, a diretiva de pré-processador #pragma markexistia.

A partir do Xcode 6, você deve usar // MARK:

Esses recursos do pré-processador permitem trazer alguma estrutura para a caixa suspensa da função do editor de código-fonte.

alguns exemplos :

// MARK:

-> será precedido por um divisor horizontal

// MARK: your text goes here

-> coloca 'seu texto aqui' em negrito na lista suspensa

// MARK: - your text goes here

-> coloca 'seu texto aqui' em negrito na lista suspensa, precedido por um divisor horizontal

update: screenshot adicionado porque algumas pessoas ainda parecem ter problemas com isso:

insira a descrição da imagem aqui


1
Não há separadores no XCode 6.1.1 usando // MARK: - textpara mim e a lista suspensa mostra MARK: text em vez de apenas texto .
mostruash

funciona bem para mim no Xcode 6.1.1, acabei de adicionar uma captura de tela - verifique com seu código?
22715 Ronny Webers

Esqueci de mencionar que tentei para arquivos Objective-C. Votação para o esforço, porém, obrigado.
mostruash 23/02

1
Entendo, agora está claro :-) A pergunta inicial pergunta sobre Swift, então não pensei nisso. Para completar: no Objective-C, você pode fazer o mesmo usando: #pragma mark - o texto do seu marcador entra aqui ou apenas #pragma mark - se você precisar de uma barra, ou #pragma mark O texto do seu marcador entra aqui para obter o mesmo sem bar. (desculpe, não consigo corrigir a marcação dos fragmentos de código, coloquei-os em negrito)
Ronny Webers

Ele mudou um pouco no Xcode 8.1, mas esta regra são geralmente trabalhar, preferem esta resposta o melhor: D
windsound

167

Para quem estiver interessado em usar extensões vs marcas pragma (como mencionado no primeiro comentário), veja como implementá-lo a partir de um 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
    }

}

Também não é necessariamente a melhor prática, mas é assim que você faz, se quiser.


6
Isso é muito legal, mas seria bom se as extensões pudessem ter nomes.
Matthew knippen

16
@ Matthew - Você poderia usar typealias. Por exemplo typealias DataSource = SwiftTableViewController. Entãoextension Datasource {}
Logan

1
@ PhongLe UITableViewControllernão é um protocolo, é uma classe. Você provavelmente quer dizer UITableViewControllerDataSource, mas esse não é o padrão usado no exemplo.
KPM

4
Eu só estou me perguntando por que não extensiontem o cabeçalho com o protocolo, como extension SwiftTableViewController : UITableViewController, seria mais legível ver por que você adicionou essa extensão à classe.
holex

7
Observe que, se sua extensão existir apenas para atuar como uma implementação de protocolo, você poderá nomear a extensão: extension SwiftTableViewController : UITableViewDelegate { .. }eextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis

117

Pragma mark - [SOME TEXT HERE]foi usado no Objective-C para agrupar várias funções juntas por separação de linha.

No Swift, você pode conseguir isso usandoMARK, TODO OR FIXME

Eu. MARCA: //MARK: viewDidLoad

Isso criará uma linha horizontal com funções agrupadas em viewDidLoad (mostrado na captura de tela 1)

Captura de tela 1

ii. FAÇAM : //TODO: - viewDidLoad

Isso agrupará a função na TODO: - categoria viewDidLoad (mostrada na captura de tela 2)

Captura de tela 2

iii. FIXME: //FIXME - viewDidLoad

Isso agrupará a função no FIXME: - categoria viewDidLoad (mostrada na captura de tela 3)

Captura de tela 3

Consulte esta documentação da apple para obter detalhes.


Observe que o "-" após TODO e FIXME não faz nada. O "-" é relevante apenas para a diretiva MARK.
rismay

1
Ele também cria um cabeçalho de seção grande e maiúsculo no código "minimapa" que você pode exibir no lado direito de um arquivo de origem. Muito útil.
Oscar

66

Documentação oficial

Documento oficial da Apple sobre o Xcode Jump Bar: adicione anotações de código à barra de salto

Capturas de tela da barra de salto para código de exemplo

Código de amostra

Comportamento no Xcode 10.1 e no macOS 10.14.3 (Mojave)

Xcode 10.1 e macOS 10.14.3

Comportamento no Xcode 10.0 e no macOS 10.13.4 (High Sierra)

Xcode 10.0 e macOS 10.13.4

Comportamento no Xcode 9.4.1 e no macOS 10.13.0

Xcode 9.4.1 e macOS 10.13.0

Discussão

!!!:e ???:às vezes não podem ser exibidos.


!!!: e ???: a sintaxe não está funcionando no Xcode 11.3.1
Jayprakash Dubey

56

No código Objective-C, o Xcode detecta comentários como o // MARK: - fooque é um pouco mais portátil do que #pragma. Mas estes também não parecem ser apanhados (ainda?).

Edit: Corrigido no Xcode 6 beta 4.


6
Espero que eles o disponibilizem em breve, porque eu gosto de manter tudo organizado com marcas de pragma>. <
Arbitur

1
Posso confirmar que // MARK: -não está funcionando no momento.
Rui Peres

Não está funcionando, mas o código de amostra está repleto desse estilo de comentário, portanto deve ser escolhido eventualmente.
Nate Cook

1
é importante que o comentário seja portátil? porque transportar um código Swift para qualquer outro idioma diretamente já é um desafio para os desenvolvedores.
holex

Hmmm, vejo muitas pessoas comentando que funciona, mas estou no Beta 6 e // MARK:não parece estar funcionando. Eu tentei com e sem o espaço, com e sem os dois pontos, all-caps e mixed (Mark). Existe algum truque? Preciso ativar um pref ou algo assim?
Olie

37

Eu acho que Extensionsé uma maneira melhor em vez de #pragma mark.

O 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) {
        ...
    }
}

O código após o uso 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
Eu acho que o seu potencial é maneira muito mais do que pragmas mas neste momento pragmas ainda melhor são porque a extensão não mostra os nomes de protocolos ou nomes personalizados no menu como pragmas para baixo não ( veja abaixo a resposta de Whasssaaahhh )
nacho4d

O novo código "// MARK:" é útil, mas também gosto do seu exemplo claro de como usar extensões - especialmente para funções delegadas!
ElmerCat

extensões também limitar o que você pode fazer - por exemplo, propriedades não armazenados
Confuso Vorlon

1
Eu uso os dois, porque o extensionsozinho não se destaca no menu suspenso do controle de navegação do Xcode.
Nicolas Miari 30/10

36

O Xcode 8 agora lida com o seguinte e aparece desta forma no menu suspenso do método:

insira a descrição da imagem aqui


e MARK:? Ele mostra como // ARK: para mim no Xcode 8
fnc12 15/16

Verifique seu código, você pode estar usando alguns caracteres unicode acima da sua linha // MARK:. Por alguma razão, o xcode fica confuso (e porque é péssimo) e não pode lidar com isso.
carlos_ms

3
O !!!e ???sintaxe não parece estar trabalhando em Xcode 8.3.3 ...
Chris Frederick

@ChrisFrederick Even !!! e ??? parece não estar funcionando no Xocde 11.3.1
Jayprakash Dubey

34

Confirmado com um engenheiro da Apple no laboratório Swift hoje de manhã na WWDC que atualmente não há nenhum #pragma ou equivalente no momento, eles consideram isso um bug, e ele chegará em breve.

Enfim, está a caminho.


O Xcode agora suporta os marcos // MARK :, // TODO: e // FIXME para anotar seu código e listá-los na barra de salto


6
Beta 2, ainda não o possui
#

Estranho. Funciona para mim muito bem. PS: atualize seu Xcode.
Daniel

@ Daniel: Qual versão do Xcode? Estou usando o Xcode 6.4 e parece não estar funcionando nele.
Jayprakash Dubey

19

Existem três opções para adicionar #pragma_markno Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Nota: Utiliza -para adicionar separadores


17

Usar

// MARK: SectionName

ou

// MARK: - SectionName

Isso dará uma linha acima da marca pragma, tornando-a mais legível.

Para facilitar, basta adicionar

// MARK: - <#label#>

aos seus snippets de código.

Caminho alternativo -

Use-o desta maneira

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

Isso não apenas adicionará uma marca (como a marca pragma), mas também segregará bem o código.


1
Se você usar Swiftlint , ele vai reclamar sobre o //MARKformato (sem espaço) e sugerir // MARK: (text)( um espaço entre //e MARK, nenhum espaço entre MARKe :, e um espaço entre :e o nome da seção)
Nicolas Miari

2
@ NicolasMiari, Obrigado, editei de acordo com a sua sugestão. E também tentará usar o SwiftLint para o próximo projeto. :)
Nikhil Manapure

13
//# MARK: - Spinner Class Methods

Adicione uma linha entre os dois pontos e sua descrição para inserir uma linha separadora. Isso ajuda a organizar seu código ainda mais. O código e a captura de tela acima fazem uso do comentário MARK com uma linha incluída.

  1. // # MARK: - Métodos de texto (LINE)
  2. // # MARK: métodos de texto (NO LINE)

Isso funciona apenas com o comentário MARK.

insira a descrição da imagem aqui


12

Você também pode estar interessado em diretivas do compilador Swift 4.2 / XCode 10 como

#warning("Some string to display")

e

#error("Some error to display")

Pode ser útil quando você realmente não quer perder algo.

insira a descrição da imagem aqui


Legal. Vou avisar outros colegas de equipe quando o escoteiro violar governar.
Sazzad Hissain Khan

9

O programador profissional deve usar essa tag para obter um bom código. Também é bom para o trabalho em equipe.

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

É fácil encontrar um método como este

É fácil encontrar um método como este


6

No Xcode 11, eles adicionaram o minimapa, que pode ser ativado Editor -> Minimap.

O Minimap mostrará o texto de cada marca para orientação rápida no código. Cada marca é escrita como// MARK: Variables

insira a descrição da imagem aqui


5

//MARK:não parecem trabalhar para mim no Xcode 6.3.2. No entanto, foi o que fiz para fazê-lo funcionar :

1) Código:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) No jump barnada parece mudar ao adicionar o //MARK: comentário. No entanto, se eu clicar no nome mais à direita na barra de salto, no meu caso MainWindowController(with a leading C icon), uma janela pop-up será exibida mostrando os efeitos do comentário // MARK:, ou seja, um cabeçalho que diz "Meus métodos legais":

insira a descrição da imagem aqui

3) Percebo também que, se eu clicar em um dos métodos do meu código, o método se tornará a entrada mais à direita na barra de salto. Para MainWindowController(with a leading C icon)ser a entrada mais à direita na barra de salto, tenho que clicar no espaço em branco acima dos meus métodos.


Não é assim que deveria ser? Que você tem que clicar na barra superior?
Arbitur

3

A Apple declara na versão mais recente do Building Cocoa Apps ,

O compilador Swift não inclui um pré-processador. Em vez disso, tira proveito dos atributos em tempo de compilação, configurações de compilação e recursos de idioma para obter a mesma funcionalidade. Por esse motivo, as diretivas de pré-processador não são importadas no Swift.

O caractere # parece ainda ser como você trabalha com várias configurações de compilação e coisas assim, mas parece que eles estão tentando reduzir sua necessidade de pré-processamento na veia do pragma e encaminhá-lo para outros recursos de idioma. Talvez isso ajude na operação dos Playgrounds e no REPL se comportando o mais próximo possível do código totalmente compilado.


0

Adicionar um item de tarefa: insira um comentário com o prefixo TODO :. Por exemplo: // TODO: [seu item de pendências].

Adicione um lembrete de correção de bug: insira um comentário com o prefixo FIXME :. Por exemplo: // FIXME: [seu lembrete de correção de bug].

Adicione um cabeçalho: insira um comentário com o prefixo MARK :. Por exemplo: // MARK: [seu cabeçalho de seção].

Adicionar uma linha separadora: Para adicionar um separador acima de uma anotação, adicione um hífen (-) antes da parte do comentário da anotação. Por exemplo: // MARK: - [seu conteúdo]. Para adicionar um separador abaixo de uma anotação, adicione um hífen (-) após a parte do comentário da anotação. Por exemplo: // MARK: [seu conteúdo] -.


0

Tente o seguinte:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

0

A marca Pragma é uma maneira de melhorar a legibilidade do seu código. Os comentários pragma apareceriam como tags na barra de jumpers do Xcode.

//MARK:  <Your comment goes here>

Exemplo: no código,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

É assim que apareceria na barra de salto do Xcode.

insira a descrição da imagem aqui


Você apenas precisa inseri-los nos lugares corretos no seu arquivo.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.