Swift: equivalente a #warning

O Swift tem um equivalente de #warning? É simplesmente usado para mostrar um aviso na GUI do Xcode

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

A Apple disse #pragma marca está chegando em breve, poderia ser o mesmo com isso.

insira a descrição da imagem aqui

No futuro, os desenvolvedores da Apple podem muito bem liberar um //WARNING: marco, ou fornecer a funcionalidade para outro marco nomeado.

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

Adicione um novo Script de Execução à guia de fases de compilation do seu destino (configurações do projeto> fases de compilation> ‘+’> nova fase de script de execução) e cole o seguinte código na checkbox 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/" 

Isso forçará o Xcode a sinalizar um aviso em tempo de compilation para qualquer // TODO: ou // FIXME: comentários marcados.

Alternativamente, você poderia alterar TAGS com uma tag customizada: TAGS="WARNING:" no código acima que manteria o comportamento padrão para TODO & FIXME e levantaria um aviso de tempo de compilation em quaisquer comentários marcados 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- warnings-from-todo-comments

EDIT: 18/11/14

@ david-h levantou um bom ponto em seu comentário. Se você quisesse apenas aumentar esses avisos em uma configuração de compilation específica, você poderia fazer 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 “Liberar” em vez de “Depurar” para segmentar apenas compilações de produção.

Editar

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

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

Resposta Original

Rápido, sujo e tão elegantemente simples, 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 você gosta … Eu costumo usar 😱 e 🛠, para algo que realmente precisa de conserto eu consideraria 💩. Você pode replace FIX_ME__ pelo que quiser: ALGORITHM_NEEDS_REVIEW , BugID_148 ou JOHNNY_YOU_BROKE_THIS são alguns exemplos.

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

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 function FIXME () no arquivo Swift:

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

e quando eu chamo de qualquer outra function, 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 o uso do Swift 2

 @available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**") 

Atualização pós-WWDC 2018

A partir do Xcode 10 e do Swift 4.2, você poderá usar #warning novamente assim:

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

Isto irá aparecer como um aviso no Xcode como esperado!

Isso funciona mesmo em combinação com as verificações #if , 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 

Há também #error se você quiser que sua construção falhe.


Pre WWDC 2018 Resposta

No Swift usando o XCode 6 você pode usar diferentes tipos de pontos de referência para diferentes propósitos. Veja 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.

Então, para definir um aviso com uma descrição, você usaria algo assim:

//TODO: Clean up this code after testing

Se você quiser apenas definir uma marca curta (supondo que você vai lembrar o que fazer), use isto:

//FIXME

EDIT: Esses pontos de referência, no entanto, só aparecem na barra de salto do XCode, que pode não ser o que você deseja e o que se esperaria – especialmente das marcas // TODO: e // FIXME. Eu 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 (execute o brew install swiftlint após uma brew update ) e adicione o script de construção sugerido ao seu projeto, você verá todos os seus marcos TODO e FIXME aparecerem como avisos no Xcode. O SwiftLint adicionará até mesmo alguns avisos / erros que você pode configurar para atender às suas necessidades – eu só posso recomendar o uso do SwiftLint e ele resolve esse problema de uma maneira incrível!

Olhe este artigo .

Você pode escrever seu próprio script, que irá 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

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

 if (false){ var x = 2; } 

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

Um CocoaPod que eu estava usando tinha .swift em seu nome, então um diretório foi retornado, o que causou o script de Kyle a falhar. Adicionar -type f ao comando find corrige esse problema observando apenas arquivos que correspondem a *.swift vez de também retornar diretórios que correspondam ao padrão.

Código final que 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/" 

Eu propus e implementei esse recurso, e ele será lançado com o Swift 4.2. Você pode usá-lo agora, baixando o conjunto de ferramentas master no swift.org .

 #if os(macOS) #error("macOS is not supported") #endif #warning("finish this") 

Se você não quiser ajustar sua configuração de compilation, outro remédio simples é colocar um marcador de posição do editor na frente do comentário:

 <#todo#>// stop and fixme! 

Você obtém um erro “Espaço reservado do editor no arquivo de origem” ao criar, mas, ao contrário da solução da Jordan, não há erro ao vivo para incomodá-lo durante a digitação:

espaço reservado do editor

Depois de muita procura e desejo, estou convencido de que não existe tal entidade. Ainda estou esperançoso com as últimas notas do Xcode mencionando a falta continuada de um mecanismo de marca # pragma, #warning e #error também podem estar chegando.

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

Escrevemos uma ferramenta configurável que permite colocar avisos e erros no Xcode Issue Navigator com base na marca de comentário e na configuração de compilation: 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 nós o usamos.

Minha resposta não satisfaz sua pergunta, mas se você quiser algo fácil, você pode usar este plugin de alcatraz que funciona em todos os projetos sem qualquer preparação adicional. Apenas 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 

Também tem preferências para adicionar novas tags

insira a descrição da imagem aqui

Vantagem deste trecho – ele não mostra avisos de 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