eureka community color bar ios xcode swift compilation

ios - community - navigation bar title color



¿Cómo manejar un gran proyecto Swift? (5)

Apple tiene algunos consejos para acelerar su compilación de Xcode en la Nota técnica 2190 . ¿Ha pensado en crear y precompilar un marco propio para externalizar módulos Swift sin cambios o algún / todo el código Objective-C?

Eliminar todo tipo de inferencias en Swift.

Este tema SO tiene algunas buenas ideas y esta publicación de blog sugiere

  1. dejar de generar paquetes dSYM y
  2. evite compilar con -O4 si usa Clang.

Aunque muchas de estas mejoras están relacionadas con Objective-C, estoy bastante seguro de que algunas de ellas siguen siendo relevantes para Swift.

Después de que la aplicación para iPhone que estoy escribiendo en Swift se vuelva bastante grande (> 150 archivos .swift + varias bibliotecas Objective-C), el inicio de Xcode se comportó bastante mal:

  • cada segunda compilación obtengo varios errores, por ejemplo:

    Command failed due to signal: Segmentation fault: 11

  • la compilación lleva una cantidad enorme de tiempo (> 2 min en MacBook Pro Retina)
  • y así.

¿Me pregunto si todos tienen los mismos problemas y tal vez alguien encontró la manera de reducir esta pesadilla?

Lo que he hecho hasta ahora: dividí el proyecto en varios marcos dinámicos que vinculo desde el proyecto principal, ayuda a reducir el tiempo de compilación, pero presenta algunos problemas nuevos.

También uso iRamDisk para mantener la carpeta DerivedData en RAM y eliminar periódicamente todos los archivos, a veces ayuda con los bloqueos de SourceKit.


Descubrí que una de las principales causas de fallas de segmentación y compilación lenta es codificar grandes matrices y diccionarios, especialmente al declararlos como constantes globales e intentar acceder a sus valores desde otro archivo .swift. Cuando almaceno todos esos datos dentro de listas, estos problemas desaparecen.


La (re) compilación es un problema conocido que estoy seguro se resolverá pronto. Algunas recomendaciones:

  • Use el Objetivo C donde sea posible: se compila rápidamente incluso si es parte de un proyecto Swift
  • Código dividido en marcos
  • Especifique tipos en lugar de dejarlo al compilador para inferirlos

Una vez más, hay una buena posibilidad de que esto se solucione pronto, por lo que quizás sea mejor no hacer grandes inversiones para reescribir o reorganizar el código en este momento.


La cadena de herramientas Swift todavía es un poco asquerosa, necesitará usar algunas soluciones temporales hasta que Apple la arregle (vea ACTUALIZACIONES a continuación)

Aquí hay una lista de elementos que puede hacer para evitar volverse loco.

Lentitud causada por el compilador Swift inmaduro

  • Cambie su flujo de trabajo de desarrollo usando Injection for Xcode . Una vez que instaló el complemento, podrá inyectar cambios de código en su simulador / dispositivo sin volver a compilar. No necesita codificar ni modificar nada en su proyecto. Comenzamos a usarlo recientemente en el trabajo y tuvo un gran impacto de nuestro lado, incluso si no se aplica a todos los casos de uso (por ejemplo, no puede crear nuevas funciones, solo puede modificar las existentes).

  • Algunas construcciones de código en particular que al compilador no le gustan y toma demasiado tiempo compilar. El problema más común es con el Comprobador de tipo que ralentiza el tiempo de compilación exponencialmente en función de la cantidad de comprobaciones de tipo que necesita hacer (lea más here para ver ejemplos prácticos y here para obtener una explicación detallada). Para identificar si sufre este problema, puede seguir esta publicación de blog , reunirá información sobre las funciones que crean lentitud mediante el uso de algunos indicadores adicionales del compilador. Alternativamente, puede usar este complemento Xcode para identificar la fuente de la lentitud de compilación.

  • Use marcos dinámicos sabiamente, donde tenga sentido. La recompilación del marco solo se realizará cuando modifique uno de sus archivos Swift (los marcos dinámicos solo están disponibles para iOS> = 7).

  • Código de condensación en los mismos archivos. Reducir la cantidad de archivos Swift acelera el proceso de compilación de manera sensata. Puede lograrlo fácilmente habilitando la "Optimización de todo el módulo" agregando un indicador personalizado definido por el usuario SWIFT_WHOLE_MODULE_OPTIMIZATION y configurándolo en SÍ y al mismo tiempo establezca el nivel de optimización en ninguno (para deshabilitar las optimizaciones que lo harían lento) Puede considerar usar esta gist , es un script de compilación que contrae todo su código en un archivo "merge.swift". Tendrá que crear un nuevo objetivo para él, pero vale la pena intentarlo.

  • Verifique dos veces las cosas enumeradas here (hay algunas razones más porque la compilación es lenta)

  • ANTICUADO Pruebe el enfoque descrito en esta publicación de blog , implica crear un script de compilación que genere un archivo de creación. Requiere intervención manual en el script de compilación (contiene la lista de archivos rápidos).

  • ANTICUADO Prueba this técnica de compilación incremental hackeada

ACTUALIZACIÓN: Compilaciones incrementales introducidas en Swift 1.2 (Xcode 6.3)

Apple finalmente introdujo compilaciones incrementales con Swift 1.2 (incluido con Xcode 6.3). Todavía no es perfecto, pero es una gran mejora.

A partir de ahora, una clase se vuelve a compilar solo cuando se modifica (o cuando se modifica una de la clase de la que depende). Sin embargo, el compilador aún no puede entender si los cambios a una clase son a su interfaz o no. Por lo tanto, cualquier tipo de cambio en una clase provoca una recopilación de esa clase y todas sus dependencias.

ACTUALIZACIÓN: recompile las clases dependientes solo cuando se introduzcan cambios en la interfaz pública en Swift 2.1 (Xcode 7.1)

A partir de Swift 2.1 (Xcode 7.1), las clases dependientes se vuelven a compilar solo cuando cambia la interfaz pública de una clase, y no con cada cambio. Esto hace una gran diferencia en particular para grandes proyectos.

Configuración del proyecto (errónea) (no relacionada con Swift)

  • Asegúrese de que "Build Active Architecture Only" es SÍ para la depuración.
  • Asegúrese de no agregar scripts de compilación pre / post que tomen demasiado tiempo.

tu podrías intentar:

  • actualizar la cantidad de RAM en su computadora
  • si tiene varios archivos .swift que hacen cosas en el mismo controlador de vista, intente condensarlos en un archivo .swift por controlador de vista
  • ajustar la configuración en fuentes de compilación para ver si tiene duplicados o si hay scripts o configuraciones que puede agregar para que se compile más rápido ...

También puede echar un vistazo a las respuestas de this publicación para obtener algunas sugerencias sobre lo que puede hacer para reducir el tiempo de compilación