Swift 5.3: ¿Qué hay de nuevo?

Hola habr El lenguaje de programación Swift es muy popular debido a su uso en la escritura de aplicaciones para iOS, por lo que su desarrollo es de interés para todos los involucrados en esta área.

Veamos qué hay de nuevo para los desarrolladores de Swift versión 5.3.

Múltiples cierres finales


La nueva versión ( SE-0279 ) ofrece una nueva sintaxis para cierres finitos que le permite llamar a múltiples cierres como parámetros de función de una manera más legible. Esto minimiza el uso de demasiados paréntesis en la firma de la función.

import Foundation

func load(url: String, success: (Data) -> Void, failure: (Error) -> Void) {
    
}

// old  version

load(url: "someURL", success: { data in }, failure: { error in })

// new multiple trailing closures

load(url: "someURL") { (data) in
    // do smth
} failure: { (error) in
    // do smth
}

En el ejemplo de 2 opciones de compra, se puede ver que visualmente la segunda se ve un poco mejor.

Cláusulas de captura multipatrón


Actualmente, cada cláusula catch en una instrucción do-catch puede contener solo un patrón. Para solucionar este problema, los desarrolladores utilizarán las capacidades de las opciones de cambio para incluir la coincidencia de patrones en el cuerpo de las declaraciones catch, aumentando así el código anidado y duplicado ( SE-0276 ).

Los elementos de captura ahora permiten al usuario especificar una lista de plantillas separadas por comas con la capacidad de vincular variables al cuerpo de captura, como en un interruptor.

enum NetworkError: Error {
    case failure, timeout
}

// old  version
func networkCall(){
  do{
    try someNetworkCall()
  } catch NetworkError.timeout{
    print("timeout")
  } catch NetworkError.failure{
    print("failure")
  }
}

// new multi-Pattern catch clauses
func networkCall(){
  do{
    try someNetworkCall()
  } catch NetworkError.failure, NetworkError.timeout {
    print("handle for both")
  }
}

Conformidad comparable sintetizada para enumeraciones


Hasta ahora, comparar 2 elementos de una enumeración no era algo que sería algo "agradable". Era necesario conformar Comparable y escribir una función estática <para determinar si el valor original es menor que otro.

Ahora Swift ( SE-0266 ) le permite no “preocuparse” por la implementación de todas estas cosas, y no necesita implementar explícitamente el protocolo, siempre que su enumeración tenga los mismos tipos. Si no se especifican los valores correspondientes, los listados se compararán en el orden semántico de la declaración.

enum Brightness: Comparable {
    case low(Int)
    case medium
    case high
}

([.high, .low(1), .medium, .low(0)] as [Brightness]).sorted()
// [Brightness.low(0), Brightness.low(1), Brightness.medium, Brightness.high]

la cantidad de selfs puede reducirse


De ahora en adelante, el self puede omitirse en aquellos lugares donde ya no es necesario ( SE-0269 ). Anteriormente, era necesario usar self en los cierres cuando capturamos valores del ámbito externo.

struct OldView: View {

    var body: some View {
        Button(action: {
            self.sayHello()
        }) {
            Text("Press")
        }
    }
    
    func sayHello() {}
}

struct NewView: View {

    var body: some View {
        Button {
            sayHello()
        } label: {
            Text("Press")
        }
    }
    
    func sayHello(){}
}

Donde en genérico


Una nueva versión del lenguaje ( SE-0267 ) introdujo la capacidad de adjuntar dónde funciona dentro de tipos y extensiones genéricos.

struct Stack<Element> {
    private var array = [Element]()

    mutating func push(_ obj: Element) {
        array.append(obj)
    }

    mutating func pop(_ obj: Element) -> Element? {
        array.popLast()
    }
}

extension Stack {
    func sorted() -> [Element] where Element: Comparable {
        array.sorted()
    }
}

Puede agregar un nuevo método sorted () a la pila, pero solo para aquellos casos en que los elementos dentro de la pila se ajustan a Comparable.

Nuevo tipo de flotador16


Se introdujo el punto flotante de media precisión Float16 ( SE-0277 ). Con el advenimiento del aprendizaje automático en dispositivos móviles en los últimos años, esto solo indica las ambiciones de Apple para promover este tema. Float 16 se usa comúnmente en GPU móviles para computación y como formato comprimido para pesos en aplicaciones ML.

let f16: Float16 = 7.29

Swift 5.3 ha introducido muchas mejoras en Swift Package Manager (SPM). Considerarlos.

  1. SE-0271 (Package Manager Resources) permite que SPM contenga recursos como imágenes, audio, JSON y más.
  2. SE-0272 (Dependencias binarias del Administrador de paquetes) permite que SPM use paquetes binarios junto con el soporte de paquetes fuente existentes. Esto significa que los SDK de código cerrado y compartido como Firebase ahora se pueden integrar con SPM.
  3. SE-0273 (Dependencias de destino condicionales del Administrador de paquetes) le permite configurar objetivos para que tengan dependencias solo para plataformas y configuraciones específicas. Por ejemplo, puede designar marcos adicionales especiales al compilar para Linux.
  4. SE-0278 le permite agregar recursos localizados.

Por lo tanto, se puede afirmar que la versión 5.3 introdujo algunas buenas innovaciones que los desarrolladores recogerán con el tiempo.

All Articles