¿Qué hay de nuevo en Swift 4?

Swift 4 ha estado trabajando en los últimos meses. Si eres como yo, puedes seguir a Swift Evolution para estar al día con todas las propuestas y cambios. Incluso si lo hace, ahora es un buen momento para revisar todas las adiciones y cambios al idioma en esta nueva iteración..

Una instantánea de Swift 4 ya estaba disponible unas semanas antes de que se anunciara Xcode 9 en la WWDC 2017. En esta publicación, aprenderá todo sobre las nuevas características introducidas en Swift 4: desde nuevas API hasta mejoras en la sintaxis del idioma..

Veamos primero cómo puede instalar el nuevo compilador en su máquina.

Configuración de Xcode

Hay dos formas de ejecutar Swift 4. Puede instalar la versión beta de Xcode 9 si tiene una cuenta de desarrollador con acceso o puede configurar Xcode 8 para que se ejecute con una instantánea de Swift 4. En el primer caso, descargue la versión beta de la página de descarga de su cuenta de desarrollador.

Si prefiere usar Xcode 8, simplemente diríjase a Swift.org para descargar la última instantánea de desarrollo de Swift 4.0. Una vez finalizada la descarga., haga doble clic para abrir el archivo .pkg, que instala la instantánea. 

Cambia a Xcode ahora y ve a Xcode> Toolchains> Gestionar toolchains. Desde allí, seleccione la instantánea Swift 4.0 recién instalada. Reinicie Xcode y ahora Swift 4 se utilizará al compilar su proyecto o área de juegos. Tenga en cuenta que todo el código presentado en este tutorial también está disponible en un repositorio de GitHub.

Nuevas características

Echemos un vistazo a las nuevas características agregadas a Swift 4. Una advertencia: el idioma todavía está en versión beta, y lo más probable es que veamos más cambios y correcciones de errores antes de que se publique la versión oficial. Además, es posible que algunas de las propuestas aprobadas más recientemente aún no se implementen en este momento, así que vigile las futuras notas de lanzamiento para ver qué se implementará y se solucionará..

Codificación y decodificación

El análisis de JSON es uno de los temas más discutidos en la comunidad Swift. Es genial ver que alguien finalmente se encargó de escribir las propuestas SE-0166 y SE-0167 y promovió la idea de actualizar las API de archivo y serialización en el marco de la Fundación. En Swift 4, ya no hay necesidad de analizar o codificar su clase, estructura o enumeración manualmente. 

Nuevo Codificable y Decodificable Se han agregado protocolos y puede hacer que sus clases se ajusten a ellos simplemente agregando Codificable (que es un alias para Decodificable y codificable) a la lista de herencia de la clase. Entonces puedes usar el JSONEncoder para codificar una instancia de la clase:

let wwdc = Conference (nombre: "WWDC", ciudad: "San Jose", fecha: Date (timeIntervalSince1970: 0)) let jsonEncoder = JSONEncoder () let jsonEncoded = try jsonEncoder.encode (wwdc) let jsonString = String (data: jsonEncoded, encoding: .utf8) // "name": "WWDC", "city": "San Jose", "date": - 978307200

Como puedes ver, creas una instancia de JSONEncoder objeto para convertir la estructura a una representación de cadena JSON. Hay algunas configuraciones que puede modificar para obtener el formato JSON exacto que necesita. Por ejemplo, para establecer un formato de fecha personalizado, puede especificar un dateEncodingStrategy de la siguiente manera:

deje que jsonEncoder = JSONEncoder () permita a dateFormatter = DateFormatter () dateFormatter.dateStyle = .long dateFormatter.timeStyle =. (datos: jsonEncoded, codificación: .utf8) // "name": "WWDC", "city": "San Jose", "date": "1 de enero de 1970 a la 1:00:00 AM GMT + 1" 

El proceso inverso para decodificar una cadena funciona de manera muy similar, gracias a la JSONDecoder clase.

Let jsonDecoder = JSONDecoder () deja decodedWWDC = try jsonDecoder.decode (Conference.self, from: jsonEncoded) // 'decodedWWDC' ya es de tipo Conference!

Como puede ver, al pasar el tipo de objeto a la descodificar método, le permitimos al decodificador saber qué objeto esperamos de los datos JSON. Si todo tiene éxito, tendremos una instancia de nuestro objeto modelo listo para ser utilizado.

Eso ni siquiera es todo el poder y la modularidad de la nueva API. En lugar de utilizar un JSONEncoder, puedes usar el nuevo PropertyListEncoder y PropertyListDecoder en caso de que necesite almacenar datos en un archivo plist. También puede crear su propio codificador y decodificador personalizados. Solo necesitas hacer que tu decodificador se ajuste a la Descifrador y su codificador a la Codificador protocolo.

Instrumentos de cuerda

Como parte del Manifiesto de cuerdas, el Cuerda Tipo también recibió una gran actualización. Ahora se ajusta una vez más (después de haber sido eliminado en Swift 2) al Colección Protocolo gracias a la propuesta SE-0163. Así que ahora puedes simplemente enumerar sobre una cadena para obtener todos los caracteres.

let text: String = "Hola de Tutsplus!" para el carácter en text.reversed () print (character)

Subcadena Es un nuevo tipo que se ajusta al mismo. StringProtocol a la que Cuerda También se ajusta. Puedes crear una nueva Subcadena solo subscribiendo un Cuerda. La siguiente línea crea un Subcadena omitiendo el primer y último carácter.

let substring = text [text.index (después de: text.startIndex)… 

Una buena adición que debería facilitar el trabajo con grandes piezas de texto son las cadenas de varias líneas. Si tiene que crear un bloque de texto que se extiende a lo largo de varias líneas, previamente tuvo que insertar manualmente \norte por todo el lugar. Esto fue muy poco elegante y difícil de manejar. Ahora existe una forma mejor de escribir cadenas de varias líneas, como puede ver en el siguiente ejemplo:

let welcomeMessage = "" "Hola, Bienvenido a Envato Tuts +. ¡Esperamos que disfrute aprendiendo con nosotros!" ""

Hay pocas reglas que acompañan esta nueva sintaxis. Cada cadena comienza con una comilla triple (""). Luego, si toda la cadena está sangrada, el espaciado de los caracteres de cierre decide la separación de cada línea de la cadena. Por ejemplo, si el carácter de cierre está sangrado por 2 pestañas, se eliminará la misma cantidad de cada línea. Si la cadena tiene una línea que no tiene este espacio, el compilador arrojará un error.

Rutas clave

Las rutas clave se agregaron en Swift 3 para facilitar la referenciación de propiedades en un objeto. En lugar de hacer referencia a una clave de objeto con un literal de cadena simple, las rutas de la clave nos permiten imponer una verificación en tiempo de compilación de que un tipo contiene la clave necesaria, lo que elimina un tipo común de error de tiempo de ejecución. 

Los caminos clave fueron una buena adición a Swift 3, pero su uso se limitó a NSObjectS y realmente no jugaron bien con las estructuras. Estas fueron las principales motivaciones detrás de la propuesta SE-0161 para actualizar la API.

La comunidad acordó una nueva sintaxis para especificar una ruta clave: la ruta se escribe comenzando con una \. Se parece a lo siguiente:

struct Conference var name = "" let city: String let nameKeyPath = \ Conference.name let wwdc = Conference (nombre: "WWDC", ciudad: "San Jose") wwdc [keyPath: nameKeyPath] // "WWDC"

los nameKeyPath objeto describe una referencia a la nombre propiedad. A continuación, se puede utilizar como un subíndice en ese objeto.

Si cambias la variable de dejar a var de wwdc, También puede modificar una propiedad específica a través de la sintaxis del subíndice de la ruta clave..

wwdc [keyPath: nameKeyPath] = "AltConf" let name = wwdc [keyPath: nameKeyPath] // "AltConf"

Rangos unilaterales

SE-0172 propuso agregar nuevos operadores de prefijo y postfijo para evitar repetir innecesariamente un índice de inicio o finalización cuando se puede inferir. Por ejemplo, si desea subíndice una matriz desde el segundo índice hasta el último, puede escribirla de la siguiente manera:

deja números = [-2, -1, 0, 1, 2] deja positivo = números [2… 

Anteriormente, el endIndex Tenía que ser especificado. Ahora, existe una sintaxis más corta:

dejar positivo = números [2…]

O, si quieres comenzar con el índice de inicio:

dejar negativo = números [… 1]

La misma sintaxis también se puede utilizar para la coincidencia de patrones en un cambiar declaración.

Subíndices genéricos

Antes de Swift 4, se requerían subíndices para definir un tipo de valor de retorno específico. SE-0148 propuso la posibilidad de definir un solo subíndice genérico que inferiría el tipo de retorno basado en el valor del resultado definido. Aparte de la anotación de tipo, funciona de la misma manera que antes.

struct Conferences let conferencias: [String: Any] // Devuelve los modelos de conferencia dada su clave. subíndice(clave: String) -> T? volver conferencias [clave] como? T // Defina el tipo de retorno de la variable y acceda al objeto a través del subíndice. dejar cosa: conferencia? = conferencias ["WWDC"]

Como puede ver, esto realmente mejora la legibilidad de sus objetos en los casos en que necesita acceder a ellos a través de la sintaxis de los subíndices..

Existenciales de clase y subtipo

Una de las características faltantes del sistema de tipo Swift hasta la fecha ha sido la capacidad de restringir una clase a un protocolo específico. Esto se ha solucionado en Swift 4: ahora puede especificar el tipo de objeto y los protocolos a los que debe ajustarse, gracias al SE-0156. Puedes, por ejemplo, escribir un método que tome un Vista que se ajusta a la Recargable protocolo con la siguiente sintaxis:

func reload (ver: UIView & Reloadable) 

Diccionario y mejoras de conjunto

Diccionario y Conjunto También recibió una actualización agradable en Swift 4. Son mucho más agradables de usar gracias a algunos métodos de utilidad que se han agregado..

mapValues

Diccionario ahora tiene una mapValues Método para cambiar todos los valores, evitando el uso del genérico. mapa Método que requiere trabajar con claves, tuplas de valor..

let conferencias = ["WWDC": "Very Good", "AltConf": "Good", "Firebase Party": "Very Fun"] // Mapea todos los valores del diccionario. deje que newConferences = conferencias.mapValores valor en valor de retorno + "👍"

filtrar Tipo de retorno

los filtrar El método ahora devuelve un objeto del mismo tipo con el que se está filtrando..

// El tipo de esta variable es [String: String] let wwdc = conference.filter $ 0.key == "WWDC"

Valores predeterminados para la búsqueda en el diccionario

Al trabajar con diccionarios, puede proporcionar un valor predeterminado al usar la sintaxis de los subíndices para evitar tener que desempaquetar una opción opcional..

// Valor por defecto si no se encuentra la clave. let talkShow = conferencias ["The Talk Show", predeterminado: "🤷‍♂️"]

Inicializador de agrupación de diccionarios

Finalmente, un Diccionario (agrupación :) se ha introducido el inicializador para facilitar la creación de un nuevo diccionario agrupando los elementos de una colección existente de acuerdo con algunos criterios. 

En los siguientes ejemplos, creamos un diccionario agrupando todos conferencias que tengan la misma letra inicial. El diccionario tendrá una clave para cada letra inicial en el conferencias colección, con cada valor que consiste en todas las claves que comienzan con esa letra.  

let diccionario = diccionario (agrupación: conferencias.valores) $ 0.uppercased (). ¡primero! 

Recursos

Si está interesado en profundizar en las nuevas funciones de Swift 4, aquí hay algunos recursos más:

  • Novedades de Swift - Sesión 402 - WWDC 2017
  • Guía de Apple Swift
  • Novedades de Ole Begemann en Swift 4 Playground
  • Guía de migración a Swift 4

Conclusión

Ahora que ha echado un vistazo a algunas de las principales características nuevas de Swift 4, probablemente esté haciendo un gran esfuerzo para comenzar a usarlas, para ayudar a mantener su código base fresco y limpio. Comience a escribir su nuevo código para aprovechar las nuevas funciones útiles y piense en refactorizar parte de su código anterior para que sea más simple y fácil de leer..

Aprende rápido

Hemos creado una guía completa para ayudarlo a aprender Swift, ya sea que esté comenzando con lo básico o si desea explorar temas más avanzados..

También puede consultar algunas de nuestras otras publicaciones sobre el desarrollo de aplicaciones de iOS.!