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?

Arbitur
fonte
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
Você pode verificar este: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey
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.

Frank Schmitt
fonte
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

Ronny Webers
fonte
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.

NatashaTheRobot
fonte
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.

Jayprakash Dubey
fonte
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.

George
fonte
!!!: 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.

Nikolai Ruhe
fonte
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) {
       ...
    }
}
jqgsninimo
fonte
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

Antoine
fonte
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

Daniel
fonte
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

Jaydip
fonte
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.

Nikhil Manapure
fonte
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

aashish tamsya
fonte
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

poucas linhas de código
fonte
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

Harshil Kotecha
fonte
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

Marek Baláž
fonte
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.

7stud
fonte
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.

UtopiaLtd
fonte
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] -.

Hiren
fonte
0

Tente o seguinte:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}
Nirbhay Singh
fonte
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

varunrathi28
fonte
Você apenas precisa inseri-los nos lugares corretos no seu arquivo.
precisa saber é o seguinte