marca # pragma no Swift?

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

Você pode usar o // MARK:


Histórico, antes do Xcode 6 Beta 4

Apenas conversei com um engenheiro aqui na WWDC, e o beta atual do Xcode não implementa o

// MARK:

estilo ainda, mas me disseram versões futuras.

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

Para aqueles que estão interessados ​​em usar extensões versus marcas pragma (como mencionado no primeiro comentário), veja como implementá-lo a partir de um Engenheiro 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 } } 

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

Até o Xcode 5 existia a #pragma mark diretiva do pré-processador.

Do Xcode 6 ligado, você precisa usar o // MARK:

Esses resources de pré-processamento permitem trazer alguma estrutura para a checkbox suspensa de funções do editor de código-fonte.

alguns exemplos :

 // MARK: 

-> será precedido por um divisor horizontal

 // MARK: your text goes here 

-> coloca ‘seu texto vai aqui’ em negrito na lista suspensa

 // MARK: - your text goes here 

-> coloca ‘seu texto vai aqui’ em negrito na lista suspensa, precedida por um divisor horizontal

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

insira a descrição da imagem aqui

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

No Swift você pode conseguir isso usando MARK, TODO OR FIXME

Eu. MARK: //MARK: viewDidLoad

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

Captura de tela 1

ii. TODO: //TODO: - viewDidLoad

Isto irá agrupar a function em TODO: – categoria viewDidLoad (mostrada na captura de canvas 2)

Captura de tela 2

iii. FIXME: //FIXME - viewDidLoad

Isto irá agrupar a function sob o FIXME: – viewDidLoad category (mostrada na captura de canvas 3)

Screenshot 3

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

Editar: Corrigido no Xcode 6 beta 4.

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

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

O Xcode 8 agora lida com ele da seguinte forma e aparece assim no dropdown do método:

insira a descrição da imagem aqui

Confirmado com um engenheiro da Apple no laboratório Swift esta manhã na WWDC que atualmente não há nenhum # pragma ou equivalente no momento, eles consideram isso um bug, e ele vai chegar em breve, então eu estou supondo beta 2, eu espero.

De qualquer forma, 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

Documento oficial do Xcode

Adicione annotations de código à barra de salto

Uma prévia no código (testado usando o Swift 4.2)

Visualizar no código

Uma pré-visualização no Xcode Jump Bar (testado no Xcode 9.4.1)

Visualizar no Xcode Jump Bar

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 trechos de código.

Forma alternativa –

Use desta maneira

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

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

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

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Nota: Usos - para adicionar separadores

 //# 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 canvas acima usam o comentário MARK com uma linha incluída.

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

Isso só funciona com o comentário MARK.

insira a descrição da imagem aqui

O programador profissional deve usar esta tag para 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

//MARK: parece não funcionar para mim no Xcode 6.3.2. No entanto, foi o que fiz para que funcionasse :

1) Código:

 import Cocoa class MainWindowController: NSWindowController { //MARK: - My cool methods func fly() { } func turnInvisible() { } } 

2) Na jump bar nada parece mudar ao adicionar o //MARK : comment. No entanto, se eu clicar no nome mais à direita na barra de salto, no meu caso ele diz MainWindowController(with a leading C icon) , então uma janela pop-up será exibida mostrando os efeitos do // MARK: comment, ou seja, um título que diz “Meus methods legais”:

insira a descrição da imagem aqui

3) Eu também noto que se eu clicar em um dos methods no meu código, então o método se torna a input mais à direita na barra de salto. A fim de obter MainWindowController(with a leading C icon) para ser a input mais à direita na barra de salto, eu tenho que clicar no espaço em branco acima dos meus methods.

A Apple declara na última versão do Building Cocoa Apps ,

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

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