
Las nuevas versiones beta están aquí y estas son algunas de las cosas más importantes que he aprendido sobre ellas.
Veloz
En primer lugar, la última versión beta de Xcode se incluye con la siguiente versión de Swift:
Apple Swift version 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7) Target: x86_64-apple-darwin18.2.0 ABI version: 0.6
Comencemos con las noticias más emocionantes:
Las aplicaciones Swift ya no incluyen bibliotecas vinculadas dinámicamente para la biblioteca estándar Swift y las superposiciones de SDK de Swift en variantes de compilación para dispositivos que ejecutan iOS 12.2, watchOS 5.2 y tvOS 12.2. Como resultado, las aplicaciones Swift pueden ser más pequeñas cuando se implementan para probar usando TestFlight, o cuando se adelgaza un archivo de aplicaciones para la distribución de desarrollo local.
¡Se acerca la estabilidad de la interfaz binaria de aplicaciones! Y esta es una excelente noticia. Creo que este es uno de los problemas más importantes en este momento con Swift. No por los efectos secundarios, sino por el incumplimiento de Swift de las promesas anteriores. De todos modos, incluso conozco a personas que reescriben sus extensiones de Apple Watch al Objetivo C para reducir el tamaño del binario (algo así como 15 MB frente a ~ 1 MB en el Objetivo C). Si desea saber más sobre el estado de ABI, siga los enlaces:
Swift - Tablero ABI y
Manifiesto de estabilidad de Swift ABI .
El atributo
@dynamicCallable
permite llamar a tipos con nombre como llama a funciones utilizando un simple azúcar sintáctico. El caso de uso principal es la interoperabilidad dinámica del lenguaje. (
SE-0216 )
Ejemplo:
@dynamicCallable struct ToyCallable { func dynamicallyCall(withArguments: [Int]) {} func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {} } let x = ToyCallable() x(1, 2, 3) // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])` x(label: 1, 2) // Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])
Este es un tema enorme y tengo sentimientos encontrados sobre la función. Entonces, lea la publicación
"Qué hay de nuevo en Swift 5.0" de Paul Hudson si desea saber más sobre lo que viene.
Se ha eliminado el modo Swift 3. Los valores admitidos para el -swift-version
son 4, 4.2 y 5.
Ha llegado el momento. La compatibilidad de fuente con Swift 3 ya no existe. Se esperaba y se anunció con Swift 5 Roadmap, pero aún así. Le recomiendo que actualice su memoria con el
"Proceso de lanzamiento de Swift 5.0" porque Swift 5 ya casi está aquí. Prepárate
En el modo Swift 5, los cambios entre las enumeraciones que se declaran en Objective-C o que provienen de los marcos del sistema son necesarios para manejar casos desconocidos , casos que pueden agregarse en el futuro o que pueden definirse de forma privada en un archivo de implementación de Objective-C . Formalmente, Objective-C permite almacenar cualquier valor en una enumeración siempre que se ajuste al tipo subyacente.
Estos casos desconocidos se pueden manejar utilizando el nuevo caso @unknown default
, que aún proporciona advertencias si se omiten casos conocidos del conmutador. También se pueden manejar utilizando un caso default
normal.
Si ha definido su propia enumeración en Objective-C y no necesita clientes para manejar casos desconocidos, puede usar la macro NS_CLOSED_ENUM
lugar de NS_ENUM
. El compilador Swift reconoce esto y no requiere que los interruptores tengan un caso predeterminado.
En los modos Swift 4 y 4.2, aún puede usar @unknown default
. Si lo omite, y se pasa un valor desconocido al conmutador, el programa atrapa en tiempo de ejecución, al igual que Swift 4.2 en Xcode 10.1. ( SE-0192 )
Fue, y es, un dolor, especialmente si no utiliza
un enfoque
predeterminado dentro de los interruptores. Recuerdo las soluciones feas para la nueva opción
UNAuthorizationOptions
propiedad
UNAuthorizationOptions
que se introdujo en iOS 12. Ahora, con un caso desconocido, es mucho más fácil manejar tales escenarios.
Administrador de paquetes Swift
Los paquetes ahora pueden personalizar la configuración de destino de implementación mínima para las plataformas de Apple cuando se utiliza la versión de herramientas Swift 5 Package.swift. La creación de un paquete emite un error si alguna de las dependencias del paquete del paquete especifica un objetivo de implementación mínimo mayor que el objetivo de implementación mínimo propio del paquete. ( SE-0236 )
La noticia más importante para mí se refiere a Swift Package Manager. Técnicamente, este cambio puede resolver muchos problemas que impiden que SPM sea útil en el mundo de iOS. En mi artículo anterior "
Swift Package Manager construye marcos de trabajo de iOS " intenté analizar el estado actual de SPM en el contexto del desarrollo de iOS. Y ahora parece que voy a tener que reevaluar mis pensamientos y conclusiones.
También hay algunos problemas graves:
Algunos proyectos pueden experimentar regresiones de tiempo de compilación de versiones anteriores;
Los proyectos de línea de comandos rápidos se bloquean al iniciarse con los errores "dyld: Biblioteca no cargada".
Solución alternativa: agregue una configuración de compilación definida por el usuario
SWIFT_FORCE_STATIC_LINK_STDLIB=YES
Se han resuelto muchos problemas y otros puntos en el
registro de cambios relacionados con Swift 5, pero son específicos de lo que haces. Verifíquelos, tal vez quiera usar heredar inicializadores designados con parámetros variables, o haya sido bloqueado por el problema de punto muerto debido a definiciones de tipo recursivas complejas que involucran clases y genéricos, o está luchando con un alias de tipo genérico dentro de un método
@objc
.
Compilador de Apple Clang
Hay muchas advertencias nuevas para Apple Clang Compiler. Y la mayoría de ellos están relacionados con marcos y módulos. Es bastante interesante porque puede asociarse con la integración de Swift Package Manager como herramienta de dependencia. Los más importantes, en mi opinión, son:
Un nuevo diagnóstico identifica los encabezados del marco que utilizan comillas incluidas en lugar del estilo de marco incluye. La advertencia está desactivada de forma predeterminada, pero puede habilitarla pasando -Wquoted-include-in-framework-header
a clang;
Los encabezados públicos en un marco podrían erróneamente #include
#import
o #include
encabezados privados, lo que provoca violaciones de capas y posibles ciclos de módulos. Hay un nuevo diagnóstico que informa de tales violaciones. Está desactivado por defecto en clang y está controlado por el -Wframework-include-private-from-public
;
El uso de @import
en los encabezados de framework evita que los encabezados se usen sin módulos. Un nuevo diagnóstico detecta el uso de @import
en los encabezados del marco cuando pasa el fmodules
- fmodules
. El diagnóstico está DESACTIVADO de forma predeterminada en clang
y se controla mediante el Watimport-in-framework-header
- Watimport-in-framework-header
;
Anteriormente, omitir la palabra clave de framework
al declarar un módulo para un marco no afectaba la compilación, pero silenciosamente hacía lo incorrecto. Un nuevo diagnóstico, - Wincomplete-framework-module-declaration
, y una nueva solución sugiere agregar la palabra clave adecuada. Esta advertencia está -fmodules
forma predeterminada cuando pasa el indicador -fmodules
a clang.
En primer lugar, cómo activarlos: vaya a la
configuración de compilación para el destino de su aplicación, busque
"Apple Clang - Banderas de compilador personalizadas" y coloque la bandera deseada en
"Otras banderas de C" .

Traté de construir una aplicación antigua basada en Objective C y encontré muchos problemas con los encabezados privados en los encabezados del marco público:

Y algunos problemas con las importaciones con doble cotización dentro de los marcos:

Le recomiendo que ejecute también dichos diagnósticos y, al menos, cree problemas para su trabajo atrasado. Un día, todos estos problemas te causarán un verdadero dolor de cabeza.
Sistema de construcción
También hay una nueva y agradable función de sistema de compilación:
Las dependencias implícitas ahora admiten la búsqueda de dependencias en otros indicadores de vinculador para marcos vinculados y bibliotecas especificadas con -weak_framework
, -reexport_framework
, -lazy_framework
, -weak-l,
, -weak-l,
-reexport-l
, -lazy-l
y -l
.
Es realmente interesante también. En general, significa que puede definir sus dependencias implícitas a través de
.xcconfig
o incluso con
xcodebuild
opciones de
xcodebuild
y evitar estos enlaces /
Incrustar fases dentro de Xcode.
Depuración
La depuración tiene nuevas características:
Las propiedades UIStackView ahora se presentan en el inspector de objetos del depurador de vistas;
El depurador de vista presenta un diseño 3D más compacto.

Xcode ahora puede capturar automáticamente un gráfico de memoria, si se encuentra una excepción de recurso de memoria durante la depuración. Para habilitar las capturas de gráficos de memoria, vaya a la pestaña Diagnóstico de la configuración de ejecución del esquema;
En iOS y watchOS, Xcode muestra el límite de memoria para ejecutar aplicaciones en el Informe de memoria a medida que se acerca al límite;

¿Ves la línea roja? Watchdog envía
applicationDidReceiveMemoryWarning(...)
cuando llegas al borde Pero pensé que sería más útil de lo que es, para ser honesto. Por ahora, solo parece una pequeña mejora agradable.
Depurador LLDB
Y LLDB Debugger también recibió algo de amor:
Ahora puede usar $0, $1,
... shorthands en la evaluación de expresiones LLDB dentro de los cierres;
El depurador LLDB tiene un nuevo alias de comando, v
, para que el comando "variable de cuadro" imprima variables en el cuadro de pila actual. Debido a que omite el evaluador de expresiones, v
puede ser mucho más rápido y debe preferirse a po
o po
.
No he notado ninguna mejora en el rendimiento, pero
v
produce una mejor salida en algunos casos, aunque no es un reemplazo para
po
en general, es solo para el marco de pila actual con algunas limitaciones. Vea los ejemplos a continuación.

Parques infantiles
¿Mi sección favorita? Parques infantiles! Comencemos con los problemas conocidos:
¡Los parques infantiles podrían no ejecutarse!
Desafortunadamente, esta es la única noticia sobre Playgrounds en la versión beta actual.
Simulador
Algunas notas sobre el simulador:
Siri no funciona en simuladores watchOS e iOS;
La sincronización de cartón entre macOS y dispositivos iOS simulados es más confiable;
Realmente espero que sea así.
Ahora solo se le solicita una vez que autorice el acceso del micrófono a todos los dispositivos simuladores.
Esta es una mejora agradable porque muchas personas tienen problemas con CI y los agentes de compilación debido a este problema. Ahora se puede automatizar una solución alternativa o, al menos, podemos actualizar nuestras guías para configurar agentes de compilación con el paso "Ejecutar un simulador una vez".
Prueba
xccov
admite la fusión de múltiples informes de cobertura, y sus archivos asociados, en un informe y archivo agregado. Al combinar informes, el informe agregado puede ser inexacto para los archivos fuente que cambiaron desde el momento en que se generaron los informes originales. Si no ha habido cambios en la fuente, el informe agregado y el archivo serán precisos;
xccov
ahora admite diferentes informes de cobertura de Xcode, que se pueden usar para calcular los cambios de cobertura a lo largo del tiempo. Por ejemplo, para diferenciar los informes de cobertura before.xccovreport
y after.xccovreport
, invoque xccov
siguiente manera: xccov diff — json before.xccovreport after.xccovreport
;
Los objetivos de marco y biblioteca estáticos ahora aparecen en el informe de cobertura como entradas de nivel superior, con valores de cobertura de línea que se agregan en todos los objetivos que incluyen el marco o biblioteca estática. Esto también resuelve un problema en el que los archivos de origen para una biblioteca estática o un objetivo de marco se incluirían en el informe de cobertura, incluso si el objetivo en sí fuera excluido de la cobertura del código en el esquema.
Estos cambios son excelentes noticias para la integración continua. Especialmente diferente. Informe a su equipo de ingeniería de lanzamiento y a cualquier otra persona responsable de tales cosas.
Sin embargo, existen algunas limitaciones relacionadas con la prueba de paralelización:
La grabación no funciona desde clones cuando la paralelización está activada;
Las pruebas de perfil no se comportan correctamente cuando la paralelización de prueba está habilitada;
También hay algunas correcciones de errores prometedoras:
Si la prueba falla debido a que el corredor de prueba falla al iniciarse, Xcode intenta generar un rico mensaje de error que describe la falla. Este error está presente en el registro de actividad de prueba y aparece en stdout
si está utilizando xcodebuild
. El error también está presente en los registros estructurados contenidos en el paquete de resultados.
Recibimos muchos de estos problemas y, por lo general, no está claro en absoluto lo que está sucediendo. A veces, está relacionado con enlaces incorrectos, a veces con sobrecarga del sistema. Debería ayudar a reducir la descamación.
Los informes de bloqueo recopilados durante las pruebas ya no omiten campos importantes, como el motivo de terminación y la descripción.
Sin comentarios solo amor.
Y el último punto sobre Xcode, útil para empresas con muchos desarrolladores, Xcode ahora admite el
servicio de almacenamiento en caché de contenido macOS . Esto significa que puede tener un servidor de almacenamiento en caché con la aplicación Xcode en su red local.
Problemas
Encontré algunos problemas con la versión beta. Principalmente con herramientas de terceros: Cartago, por ejemplo, que no funciona, con el siguiente error:
Could not find any available simulators for iOS
Revisé el simulador disponible, y parece que algo está roto en la versión beta actual; También es imposible descargar otros tiempos de ejecución de Xcode, la lista de simuladores disponibles está vacía (un radar lleno):
$ xcrun simctl list devices --json | grep -A16 12.1 "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [ { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 5s", "udid" : "DDD36346-A76F-42E8-80F4-6F11E1EE4BEB", "availabilityError" : "runtime profile not found" }, { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 6", "udid" : "21794717-BC89-45E4-9F57-8CF9D14A87D1", "availabilityError" : "runtime profile not found" }, --
Es una beta, por supuesto. Y el registro de cambios es enorme. Sea paciente y razonable :)
PS Carthage ya tiene una solución (
# 2691 ).
Esta bien Parece que están puliendo su deuda tecnológica y aplicando parches de seguridad. Dos cosas están rotas:
Es posible que no pueda autenticarse en Wallet después de seleccionar una tarjeta;
Es posible que no pueda comprar un plan de datos prepago utilizando datos móviles.
Y
Apple News estará disponible en Canadá . Estén atentos.
Lo único nuevo aquí es un problema potencial con Safari 12.1. Después de actualizar desde Safari 10.1.2:
Después de actualizar a Safari 12.1 desde Safari 10.1.2, es posible que las páginas web no se muestren.
Solución alternativa: ejecute el siguiente comando en la Terminal:
defaults delete com.apple.Safari
Con las siguientes consecuencias:
Advertencia: perderá su configuración anterior de Safari después de ejecutar el comando anterior.
Corte final
Este artículo resultó ser mucho más largo de lo que pensaba. Bueno, te di todos mis pensamientos sobre todas las secciones anteriores. Una versión corta de todo el artículo es simplemente, '¡Swift 5 ha llegado!'
¡Estén atentos e hidratados! Y gracias por leer.