Swift: equivalente de advertencia

192

¿Swift tiene un equivalente de # advertencia? Simplemente se usa para mostrar una advertencia en la propia GUI de Xcode

También me interesa saber si hay un #error equivalente.

Apple ha dicho que la marca #pragma llegará pronto, posiblemente podría ser lo mismo con esto.

ingrese la descripción de la imagen aquí

Algún chico
fuente
77
Supongo que será //WARNINGcomo #pragma, //MARKpero actualmente ninguno de ellos se agrega a XCode beta.
Lord Zsolt
1
Recomiendo encarecidamente llenar un radar para pedir // ADVERTENCIA
pixel
@pixel Acabo de archivar un radar
SomeGuy
¿Puedes aceptar la respuesta de Jordan Smith? Esto ahora está integrado en Swift como #warning
Bill

Respuestas:

157

En el futuro, los desarrolladores de Apple pueden lanzar un //WARNING:hito o proporcionar la funcionalidad para otro hito con nombre.

Sin embargo, para invocar esta funcionalidad con Swift en Xcode hoy, puede hacer lo siguiente, tal como lo describen Ben Dodson y Jeffrey Sambells:

Agregue un nuevo script de ejecución a la pestaña de fases de compilación de su destino (configuración del proyecto> fases de compilación> '+'> nueva fase de script de ejecución) y pegue el siguiente código en el cuadro vacío:

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/"

Esto obligará a Xcode para marcar un aviso en tiempo de compilación para cualquier // TODO:o // FIXME:comentario que de marcado.

Alternativamente, puede modificar TAGS con una etiqueta personalizada: TAGS="WARNING:"en el código anterior, que mantendría el comportamiento predeterminado para TODO y FIXME y generaría una advertencia de tiempo de compilación en cualquier comentario 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- advertencias de todo-comentarios

EDITAR: 18/11/14

@ david-h planteó un buen punto en su comentario. Si solo desea generar estas advertencias en una configuración de compilación específica, puede hacer lo siguiente:

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

Alternativamente, puede usar "Release" en lugar de "Debug" para apuntar solo a las compilaciones de producción.

Kyle G
fuente
Esta es una solución temporal muy agradable hasta que Apple la arregla :)
SomeGuy
El problema con esto es que mi aplicación tiene dos modos: desarrollo y producción. Quiero saber que se construye limpiamente en producción, pero recibo una advertencia en el desarrollo que esencialmente me recuerda que estoy en modo de desarrollo, usando diferentes URL, tiempos de espera, otras configuraciones, etc. La sugerencia anterior de Arie me permite hacer esto, su técnica solo marca todo Dicho esto, esta técnica tiene su uso seguro, ¡así que también la voté!
David H
¡Qué idea tan útil! Gracias por compartir esta información útil.
Tommy
@kyle ¿Podría decirme el significado de perl -p -e "s / ($ TAGS) / warning: \ $ 1 /" this line
Rocker
3
Funciona muy bien, sin embargo, tuve que agregar la -type fopción al findcomando para excluir directorios de los resultados de búsqueda. Esto no debería ser un problema para la mayoría de las personas, pero cualquiera que use el R.swiftpod se encontrará con el mismo error que tuve porque R.swiftes un directorio
Dan F
156

Editar

A partir de Swift 4.2, el soporte de nivel de idioma está disponible tanto para advertencias de compilación como para errores.

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

Respuesta original

Rápido, sucio y tan elegante y simple al mismo tiempo.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Lanza una advertencia de que 'FIX_ME__🛠🛠🛠' nunca se usó.

Puede agregar emoticones al nombre de la variable si lo desea ... A menudo uso 😱 y 🛠, para algo que realmente necesita reparación, incluso consideraría 💩. Se puede reemplazar FIX_ME__con lo que quieras: ALGORITHM_NEEDS_REVIEW, BugID_148o JOHNNY_YOU_BROKE_THISson algunos ejemplos.

Rápido, sin configuración, conciso, y los emoticones pueden incluso agregar humor / personalidad a su código. A veces la solución más simple es la mejor solución.

Jordan Smith
fuente
66
... ¿Por qué todos los votos negativos? Esto funciona tan bien como cualquier otro método aquí. Si no está votando, al menos dé una razón, tal vez no fui lo suficientemente claro o hay algo mal con lo que estoy haciendo. Me encantaría saber si hay.
Jordan Smith
16
Sí, no estoy seguro de por qué esto no se vota más. Todas las otras soluciones son demasiado complicadas.
Simone Manganelli
3
@ZaEeMZaFaR es muy probable que el compilador lo elimine. Además, en la mayoría de los casos, estos problemas se solucionarán antes del lanzamiento. E incluso si, por alguna razón, el compilador no es lo suficientemente inteligente como para deshacerse de él (creo que esto es muy poco probable), 100 Int vars en memoria son 6.4kb de memoria, básicamente nada. No creo que tengas un punto válido, lo siento.
Jordan Smith
44
Usé los otros pero cambié a usar este. Es el más simple e incluso puedes darte un pequeño mensaje que aparecerá en la advertencia, es decir, let fixMeMakeMeNonOptional: Intte da Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it en el navegador de problemas. Todas las otras soluciones le dan mensajes de error mucho más genéricos.
Nathan Perry
1
@NathanPerry, sí, de acuerdo. Configurar algo complejo no siempre es una opción, especialmente cuando trabajas en equipo o en múltiples proyectos, etc. Además, las soluciones simples son siempre las mejores. Actualmente acabo de poner el mensaje al lado en un comentario, pero lo que haces tampoco es una mala idea.
Jordan Smith
81

Actualización posterior a WWDC 2018

Comenzando con Xcode 10 y Swift 4.2, ahora podrá volver a usarlo #warningasí:

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

¡Esto aparecerá como una advertencia en Xcode tal como se esperaba!

Esto funciona incluso en combinación con #ifcontroles, por ejemplo, lo siguiente solo mostrará una advertencia si su plataforma de destino es iOS:

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

También hay #errorsi quieres que tu construcción falle.


Respuesta previa a WWDC 2018

En Swift usando XCode 6, puede usar diferentes tipos de puntos de referencia para diferentes propósitos. Esto es lo que Apple dice al respecto:

Xcode ahora admite // MARK :, // TODO: y // FIXME: puntos de referencia para anotar su código y enumerarlos en la barra de salto.

Entonces, para configurar una advertencia con una descripción, usaría algo como esto:

//TODO: Clean up this code after testing

Si solo desea establecer una marca corta (suponiendo que recordará qué hacer), use esto:

//FIXME

EDITAR: Sin embargo, estos puntos de referencia solo aparecen en la barra de salto de XCode, que puede no ser lo que desea y lo que uno esperaría, especialmente de las marcas // TODO: y // FIXME. He archivado un radar sobre eso: # 17776817. Esperemos que Apple agregue esto en las próximas versiones en XCode 6.

SOLUCIÓN (EDIT 2): Si instala el Swift Linter través Homebrew (correr brew install swiftlintdespués de una brew update) y añadir el script de construcción sugerido a su proyecto, a continuación, podrás ver todos tus TODOe FIXMEhitos aparecen como advertencias dentro de Xcode. SwiftLint incluso agregará más advertencias / errores que puede configurar para satisfacer sus necesidades. ¡Solo puedo recomendarle usar SwiftLint y resuelve este problema de una manera excelente!

Jeehut
fuente
77
Lamentablemente, estos no aparecen en el panel de advertencias cuando compila su aplicación. Todavía estoy esperando uno que sobresalga como un pulgar dolorido, por lo que es probable que no se olvide de ellos. Estos solo aparecen en la barra de salto y deberá recordar buscar en su proyecto "// TODO" para encontrarlo. O si alguien sabe cómo verlos para todo el proyecto, avíseme. - hora de otro radar :)
SomeGuy
1
Uh sí, tienes razón. Pensé que la barra de salto es la barra lateral a la izquierda y que esas marcas aparecerían en el Issue Navigator, pero no lo hacen. Acabo de archivar un radar sobre eso: # 17776817. :)
Jeehut
@SomeGuy ¿Qué quieres decir con que aparecen en la barra de salto? Por lo que puedo ver, no hay ningún lugar en la barra que se encuentra en la parte superior de la ventana del editor en Xcode. La única forma de notarlos (para mí) parece ser buscarlos con Command + F. ¿Dónde se muestran los puntos de referencia?
almel
2
@almel La barra de salto es el menú desplegable en la parte superior de un archivo, proporciona una lista de funciones en el archivo actual i.cubeupload.com/jLRwTs.png
SomeGuy
55

Todavía no agregado por el equipo de Apple todavía. Lo que decidí hacer es probablemente una trampa, pero al menos me muestra un mensaje FIXME. Entonces, lo que hago es declarar la función FIXME () en el archivo Swift:

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

y cuando lo llamo desde cualquier otra función, muestra una advertencia, por ejemplo

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

ingrese la descripción de la imagen aquí

Para uso Swift 2

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
interrumpir
fuente
2
Solo para que conste: @availability ha cambiado su nombre a "@available" en Swift 2.
Tobias
42

Mira este artículo .

Puede escribir su propio script que resaltará todas las etiquetas.

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/"

Esto da como resultado: ingrese la descripción de la imagen aquí

Kelin
fuente
Agregue egrep --directories='skip'para ignorar directorios con nombres como Device.swift
chunkyguy
12

Como alternativa, si desea que aparezca algo en el panel de advertencias, puede escribir algo como:

if (false){
   var x = 2;
}

Realmente no puede aparecer ningún texto, pero al menos es un marcador más visible, especialmente si tiende a tratar (la mayoría) de las advertencias como errores.

Arie Litovsky
fuente
11
O simplemente hazlo si es falso {"el mensaje de advertencia"}
Bao Lei
Esta solución es terrible. Pero parece ser el mejor disponible. Votado, gracias.
skagedal
6

Me propuse y implementado esta característica, y se venderá con Swift 4.2. Puede usarlo ahora descargando la mastercadena de herramientas en swift.org .

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

Un CocoaPod que estaba usando tenía .swiftsu nombre, por lo que se devolvió un directorio, lo que provocó que Kyle se bloqueara. Agregar -type fal findcomando corrige ese problema al mirar solo los archivos que coinciden en *.swiftlugar de devolver directorios que coinciden con el patrón.

Código final que usé:

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/"
esflogen
fuente
1
¿Hay alguna manera de que el compilador no se queje? Recibo "errores emitidos por Command / bin / sh pero no devolvió un código de salida distinto de cero para indicar un error"
Chris Paveglio
Como alternativa, vea este comentario más arriba
chunkyguy
4

Si no desea ajustar la configuración de su compilación, otro remedio casero simple es colocar un marcador de posición de editor delante del comentario:

<#todo#>// stop and fixme!

Cuando construye, obtiene un error de "Marcador de posición del editor en el archivo fuente", pero a diferencia de la solución de Jordan, no hay ningún error en vivo que lo moleste mientras escribe:

marcador de posición del editor

Minh Nguyễn
fuente
Buena idea, pero ¿no es la idea lanzar una advertencia y no un error? Hacer esto no te permitirá compilar hasta que lo elimines, lo que, en muchos (¿la mayoría?) Definitivamente no es lo que deseas. Todo y las marcas de arreglo a veces implican semanas de trabajo. Me imagino que desearía construir y ejecutar su proyecto durante este tiempo :)
Jordan Smith
Claro, ese es un buen punto. Este enfoque solo es útil para las tareas pendientes más urgentes que tienen que suceder antes de confirmar o incluso ejecutar la aplicación. El principal beneficio es que el resaltado de sintaxis y otros detalles del editor continúan funcionando a pesar de la presencia de este marcador de posición. Yo uso algunos de los otros enfoques aquí, incluido el suyo, pero los marcadores de posición a veces son útiles cuando se realizan múltiples tareas. Se adapta a los mismos casos de uso que los marcadores de posición que Xcode inserta al completar automáticamente una llamada de función.
Minh Nguyễn
3

Después de mucha búsqueda y anhelo, estoy convencido de que no existe tal entidad. Todavía tengo esperanzas con las últimas notas de lanzamiento de Xcode que mencionan la falta continua de un mecanismo de marca #pragma, también pueden aparecer #warning y #error.

Como comentario aparte, recomiendo presentar un radar con Apple en bugreport.apple.com para agregar esta funcionalidad (puede engañar a 17702491).

rcw3
fuente
1
Hice mi parte: rdar: // 19005171
David H
1
También lleno en un radar
HixField
2

Escribimos una herramienta configurable que le permite poner advertencias y errores en Xcode Issue Navigator en función de la etiqueta de comentario y la configuración de compilación: https://github.com/doubleencore/XcodeIssueGenerator

Instalarlo:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Luego ponga una línea en una Fase de Ejecución del Script de Ejecución

# 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/"

Aquí hay un artículo que describe cómo lo usamos.

Soolwan
fuente
2

Es posible que llegue tarde a la fiesta con Xcode 10 que admite errores y advertencias, pero simplemente poniendo una Cadena:

"Need to finish implementing this"

generará una advertencia: String literal is unusedcon la función de autocompletar aún funcionando y el proyecto aún compilándose

Przemysław Wrzesiński
fuente
1

Mi respuesta no es satisfacer su pregunta, pero si quiere algo fácil, puede usar este complemento de alcatraz que funciona en todos los proyectos sin ninguna preparación adicional. Solo haz lo siguiente:

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

También tiene preferencias para agregar nuevas etiquetas

ingrese la descripción de la imagen aquí

Nikolay Shubenkov
fuente
1

Ventaja de este fragmento: no muestra advertencias 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

Cómo instalar:

ingrese la descripción de la imagen aquí

Igor
fuente