Swift: #warning equivalente

192

Swift tem um equivalente a #warning? É simplesmente usado para mostrar um aviso na própria GUI do Xcode

Também estou interessado em saber se há um #error equivalente.

A Apple disse que a marca #pragma será lançada em breve, pode ser o mesmo com isso.

insira a descrição da imagem aqui

SomeGuy
fonte
7
Suponho que será //WARNINGexatamente como #pragma, //MARKmas atualmente nenhum deles é adicionado ao XCode beta.
Lord Zsolt
1
Eu altamente sugerem a apresentação de um radar para pedir // AVISO
de pixel
@pixel Acabei entrou com um radar
SomeGuy
Você pode aceitar a resposta de Jordan Smith? Isto agora é construído em Swift como #WARNING
Bill

Respostas:

157

No futuro, os desenvolvedores da Apple poderão muito bem lançar um //WARNING:ponto de referência ou fornecer a funcionalidade para outro ponto de referência nomeado.

Para invocar essa funcionalidade com o Swift no Xcode hoje, você pode fazer o seguinte, conforme descrito por Ben Dodson e Jeffrey Sambells:

Adicione um novo script de execução à guia de fases de construção do seu destino (configurações do projeto> fases de construção> '+'> nova fase de script de execução) e cole o seguinte código na caixa vazia:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

Isto irá forçar Xcode para sinalizar um aviso em tempo de compilação para qualquer // TODO:ou // FIXME:comentários que você marcação.

Como alternativa, você pode alterar o TAGS com uma tag personalizada: TAGS="WARNING:" no código acima, que manteria o comportamento padrão do TODO & FIXME e geraria um aviso de tempo de compilação em qualquer comentário marcado como // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- avisos-de-todo-comentários

EDIT: 18/11/14

@ david-h levantou um bom argumento em seu comentário. Se você deseja emitir apenas esses avisos em uma configuração de compilação específica, faça o seguinte:

if [ "${CONFIGURATION}" = "Debug" ]; then
TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

Como alternativa, você pode usar "Release" em vez de "Debug" para direcionar apenas as compilações de produção.

Kyle G
fonte
Esta é uma solução temporária muito bom até que a Apple corrige-lo :)
SomeGuy
O problema é que meu aplicativo tem dois modos - desenvolvimento e produção. Quero saber que ele fica limpo na produção, mas recebo um aviso no desenvolvimento que basicamente me lembra que estou no modo dev - usando diferentes URLs, tempos limite, outras configurações etc. A sugestão de Arie acima permite que eu faça isso, sua técnica é apenas sinaliza tudo. Dito isto, esta técnica tem seu uso, com certeza, então eu votei nela também!
18714 David David H
Que ideia útil! Obrigado por compartilhar esta informação útil.
Tommy
@kyle Poderia, por favor deixe-me saber o significado de perl -p -e "s / ($ TAGS) / aviso: \ $ 1 /" esta linha
Rocker
3
Funciona muito bem, no entanto, tive que adicionar a -type fopção ao findcomando para excluir diretórios dos resultados encontrados. Isso não deve ser um problema para a maioria das pessoas, mas qualquer pessoa que use o R.swiftpod terá o mesmo erro que eu, porque R.swifté um diretório
Dan F
156

Editar

A partir do Swift 4.2, o suporte no nível do idioma está disponível para avisos e erros de compilação.

#warning("Warning description")
#error("Throws a build error")

Resposta original

Rápido, sujo e muito elegante, tudo ao mesmo tempo.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Lança um aviso de que 'FIX_ME__🛠🛠🛠' nunca foi usado.

Você pode adicionar emoticons ao nome da variável, se quiser ... Costumo usar 😱 e 🛠, para algo que realmente precisa de conserto que eu consideraria 💩. Você pode substituir FIX_ME__com o que quiser: ALGORITHM_NEEDS_REVIEW, BugID_148ou JOHNNY_YOU_BROKE_THISsão alguns exemplos.

Rápido, sem configuração, conciso e emoticons podem até adicionar humor / personalidade ao seu código. Às vezes, a solução mais simples é a melhor solução.

Jordan Smith
fonte
6
... Por que todos os votos negativos? Isso funciona tão bem quanto qualquer outro método aqui. Se você está votando negativamente, pelo menos, dê uma razão, talvez eu não tenha sido claro o suficiente ou haja algo errado com o que estou fazendo. Eu adoraria saber se existe.
Jordan Smith
16
Sim, não sei por que isso não foi mais votado. Todas as outras soluções são muito complicadas.
Simone Manganelli 22/02
3
@ZaEeMZaFaR o compilador provavelmente se livraria dele. Além disso, na maioria dos casos, esses problemas serão corrigidos antes do lançamento. E - mesmo que por qualquer motivo, o compilador não seja inteligente o suficiente para se livrar dele (acho que isso é muito improvável) - 100 intars de memória são 6.4kb de memória - basicamente nada. Eu não acho que você tenha um ponto válido desculpe.
Jordan Smith
4
Eu usei os outros, mas passei a usar este. É o mais simples e você pode até dar a si mesmo uma pequena mensagem que aparecerá no aviso, ou seja: let fixMeMakeMeNonOptional: Intfornece Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it no navegador de problemas. Todas as outras soluções oferecem muito mais mensagens de erro genéricas.
Nathan Perry
1
@ NathanPerry sim, concordou. Configurar algo complexo nem sempre é uma opção, especialmente quando você trabalha em equipe ou em vários projetos etc. Além disso, soluções simples são sempre as melhores. Atualmente, apenas coloco a mensagem ao lado em um comentário, mas o que você faz também não é uma má idéia.
Jordan Smith
81

Atualização pós-WWDC 2018

A partir do Xcode 10 e do Swift 4.2, você poderá usar #warningnovamente da seguinte forma:

#warning("TODO: Clean up this code after testing")

Isso aparecerá como um aviso no Xcode, conforme o esperado!

Isso funciona mesmo em combinação com #ifverificações, por exemplo, o seguinte mostrará apenas um aviso se sua plataforma de destino for iOS:

#if os(iOS)
    #warning("this code is untested in iOS")
#endif

Também há #errorse você quiser que sua compilação falhe.


Resposta Pré WWDC 2018

No Swift usando o XCode 6, você pode usar diferentes tipos de pontos de referência para diferentes fins. Aqui está o que a Apple diz sobre isso:

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

Portanto, para definir um aviso com uma descrição, você usaria algo como isto:

//TODO: Clean up this code after testing

Se você deseja apenas definir uma marca curta (supondo que você se lembre do que fazer), use o seguinte:

//FIXME

EDIT: No entanto, esses marcos aparecem apenas na barra de salto do XCode, que pode não ser o que você deseja e o que seria de esperar - especialmente das marcas // TODO: e // FIXME. Arquivei um radar sobre isso: # 17776817. Espero que a Apple adicione isso nas próximas versões do XCode 6.

SOLUÇÃO (EDIÇÃO 2): Se você instalar o Swift Linter via Homebrew (executado brew install swiftlintapós a brew update) e adicionar o script de construção sugerido ao seu projeto, verá todos os seus marcos TODOe FIXMEcomo avisos no Xcode. O SwiftLint ainda adiciona mais alguns avisos / erros que você pode configurar para atender às suas necessidades - só posso recomendar o uso do SwiftLint e resolve esse problema da melhor maneira possível!

Jeehut
fonte
7
Infelizmente, eles não aparecem no painel de avisos quando você compila seu aplicativo. Eu ainda estou esperando por um que se destaca como um polegar dolorido, para que você não os esqueça. Elas são exibidas na barra de salto e você deve se lembrar de procurar no seu projeto "// TODO" para encontrá-lo. Ou se alguém souber como vê-los para todo o projeto, me avise. - hora de outro radar :)
SomeGuy
1
Sim, você está certo. Eu pensei que a barra de salto é a barra lateral à esquerda e que essas marcas apareceriam no Issue Navigator, mas não aparecem. Acabei de preencher um radar sobre isso: # 17776817. :)
Jeehut
@SomeGuy O que você quer dizer com eles aparecem na barra de salto? Pelo que vejo, eles não estão em nenhum lugar da barra localizada na parte superior da janela do editor no Xcode. A única maneira de notá-los (para mim) parece ser procurá-los com Command + F. Onde os pontos de referência são mostrados?
almel
2
@almel O jumpbar é o drop-down no topo de um arquivo, ele dá uma lista de funções no arquivo atual i.cubeupload.com/jLRwTs.png
SomeGuy
55

Ainda não foi adicionado pela equipe da Apple ainda. O que eu decidi fazer é provavelmente uma trapaça, mas pelo menos me mostra uma mensagem FIXME. Então, o que eu faço é declarar a função FIXME () no arquivo Swift:

@availability(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
func FIXME()
{
}

e quando eu o chamo de qualquer outra função, ele mostra um aviso, por exemplo

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    FIXME()     // Incomplete method implementation.
    return 0
}

insira a descrição da imagem aqui

Para uso no Swift 2

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
interromper
fonte
2
Apenas para o registro: @availability foi renomeado para "@available" em rápida 2.
Tobias
42

Veja este artigo .

Você pode escrever seu próprio script que destacará todas as tags.

TAGS="TODO:|FIXME:"
ERRORTAG="ERROR:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$|($ERRORTAG).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/" | perl -p -e "s/($ERRORTAG)/ error: \$1/"

Isso resulta em: insira a descrição da imagem aqui

kelin
fonte
Adicione egrep --directories='skip'para ignorar diretórios com nomes como Device.swift
chunkyguy
12

Como alternativa, se você quiser que algo apareça no painel de avisos, escreva algo como:

if (false){
   var x = 2;
}

Você não pode realmente exibir nenhum texto, mas pelo menos é um marcador mais visível, especialmente se você tende a tratar a maioria dos avisos como erros.

Arie Litovsky
fonte
11
Ou apenas faça se falso {"a mensagem de aviso"}
Bao Lei
Esta solução é terrível. Mas parece ser o melhor disponível. Votado, obrigado.
skagedal
6

I proposto e implementado esse recurso, e será lançado com Swift 4.2. Você pode usá-lo agora fazendo o download da mastercadeia de ferramentas em swift.org .

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")
Harlan Haskins
fonte
5

Um CocoaPod que eu estava usando tinha .swiftem seu nome; portanto, um diretório foi retornado, o que causou a falha do script por Kyle. A adição -type fao findcomando corrige esse problema, apenas visualizando os arquivos correspondentes, em *.swiftvez de também retornar diretórios correspondentes ao padrão.

Código final que eu usei:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -type f -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
sflogen
fonte
1
Existe uma maneira de não fazer o compilador reclamar? Eu recebo "Erros emitidos por comando / bin / sh, mas não
retornei
Como alternativa, veja este comentário acima
chunkyguy
4

Se você não deseja ajustar sua configuração de compilação, outro remédio caseiro simples é colocar um espaço reservado de editor na frente do comentário:

<#todo#>// stop and fixme!

Você recebe um erro "Espaço reservado do editor no arquivo de origem" ao criar, mas, diferentemente da solução da Jordan, não há nenhum erro ao vivo para incomodá-lo ao digitar:

espaço reservado para editor

Minh Nguyễn
fonte
Boa ideia - mas não é a idéia de emitir um aviso e não um erro? Fazer isso não permitirá que você construa até removê-lo, o que, em muitos casos (na maioria?), Definitivamente não é o que você deseja. Todo e FIXME marcas, por vezes, envolvem semanas de trabalho - eu imagino que você gostaria de construir e executar o seu projeto durante este tempo :)
Jordan Smith
Claro, esse é um bom argumento. Essa abordagem é útil apenas para itens de tarefas mais urgentes que precisam acontecer antes de confirmar ou mesmo executar o aplicativo. O principal benefício é que o destaque da sintaxe e outras sutilezas do editor continuam a funcionar, apesar da presença desse espaço reservado. Eu mesmo uso algumas das outras abordagens aqui, incluindo a sua, mas, às vezes, os espaços reservados são úteis na multitarefa. Ele se encaixa nos mesmos casos de uso que os espaços reservados que o Xcode insere ao concluir automaticamente uma chamada de função.
Minh Nguyễn
3

Depois de muita pesquisa e desejo, estou convencido de que não existe tal entidade. Ainda estou esperançoso com as notas de versão mais recentes do Xcode mencionando a falta contínua de um mecanismo de marca #pragma, #warning e #error também podem estar chegando.

Como um aparte, eu recomendo arquivar um Radar na Apple em bugreport.apple.com para adicionar essa funcionalidade (você pode enganar 17702491).

rcw3
fonte
1
Eu fiz a minha parte: rdar: // 19005171
David H
1
Também preencheu um radar
HixField 27/03
2

Escrevemos uma ferramenta configurável que permite colocar avisos e erros no Xcode Issue Navigator com base na tag de comentário e na configuração da compilação: https://github.com/doubleencore/XcodeIssueGenerator

Instale-o:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Em seguida, coloque uma linha em uma fase de criação de script de execução:

# Mark WARNINGs, SERIOUSs, and TODOs as warnings in DEBUG builds excluding the Vendor and Third Party directories.
XcodeIssueGenerator -b DEBUG -w "WARNING, SERIOUS, TODO" -x "Vendor/, Third Party/"

Aqui está um artigo descrevendo como usamos.

Soolwan
fonte
2

Eu posso estar atrasado para a parte com o Xcode 10 suportando erros e avisos, mas simplesmente colocando uma String:

"Need to finish implementing this"

produzirá um aviso: String literal is unusedcom o preenchimento automático ainda funcionando e o projeto ainda compilando.

Przemysław Wrzesiński
fonte
1

Minha resposta não é suficiente para satisfazer sua pergunta, mas se você quiser algo fácil, pode usar este plug - in de alcatraz, que funciona em todos os projetos sem qualquer preparação adicional. Faça o seguinte:

1) install Alcatraz (Nice package manager for Xcode Plug-ins) by entering this line in terminal: 
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
2) Then restart Xcode and on it launch agree to install all bundles not included in Xcode
3) In Xcode select menu item -> Window -> Package manager -> type in search panel XTodo and press install
4) Relaunch Xcode and again agree to install additional bundles
5) From now press Ctrl + T and you will see all Tags in nice window

Ele também tem preferências para adicionar novas tags

insira a descrição da imagem aqui

Nikolay Shubenkov
fonte
1

Vantagem desse snippet - ele não mostra avisos dos Pods:

if [ "${CONFIGURATION}" = "DEBUG" ]; then 
    TAGS="TODO:|FIXME:|WARNING:|warning:" find "." \( -name "*.swift" \) -not -path "./Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

Como instalar:

insira a descrição da imagem aqui

Igor
fonte