BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Swift 5.2 liberado no Xcode 11.4 Beta

Swift 5.2 liberado no Xcode 11.4 Beta

Favoritos

A linguagem de programação Swift, desenvolvida originalmente pela Apple e liberada em 2014, acaba de chegar na versão 5.2. O Swift 5.2, disponível no Xcode 11.4 Beta, é uma versão projetada para incluir melhorias significativas na qualidade e desempenho. Seguindo o processo Swift Evolution, essa versão traz callAsFunction, subscript com default arguments, Key Path Expressions as Functions, uma nova arquitetura de diagnósticos, e mais.

O callAsFunction() ou "Callable values of user-defined nominal types" introduz callable values estáticos no Swift. Callable values podem ser executados usando a mesma sintaxe de uma função uma vez que definem um comportamento parecido com uma função. Essa funcionalidade suporta argument labels e parameter types, throws e rethrows, e não é restrita a declarações de tipo primários. Além disso, é possível definir múltiplos métodos callAsFunction de um mesmo tipo, e o Swift gerencia qual será executado, parecido com um simples overloading.

struct Adder {
    var base: Int
    func callAsFunction(_ x: Int) -> Int {
        return base + x
    }
}

let add3 = Adder(base: 3)
add3(10) // returns 13, same as adder.callAsFunction(10)

Subscripts são atalhos para acessar elementos de uma collection, sequence ou list, e podem ser definidos em classes, structs, e enumerations. Os desenvolvedores podem usar subscripts para definir e recuperar valores pelo índice sem a necessidade de escrever um método para definir e outro para recuperar os valores. No Swift 5.2, agora é possível adicionar subscripts com default arguments para qualquer tipo de parâmetro. O seguinte trecho de código demonstra o struct BucketList que retorna um valor padrão quando alguém tenta ler um índice que não existe:

struct BucketList {
    var items: [String]
 
    subscript(index: Int, default: String = "your list is over") -> String {
        if index >= 0 && index < items.count {
            return items[index]
        } else {
            return `default`
        }
    }
}
 
let bucketList = BucketList(items: ["travel to Italy", "have children", "watch super bowl")
print(bucketList[0])
print(bucketList[4])

Esse código irá exibir "travel to Italy" e então "your list is over", o último devido a tentativa de acesso de um índice não existente.

O Key Path Expressions as Functions introduz a habilidade de usar a key path expression \Root.value onde quer que funções de (Root) -> Value são permitidas. Considerando o seguinte struct User:

struct User {
    let email: String
    let isActive: Bool
}

Vamos supor que já criamos um array users; para obter a lista de users antes da funcionalidade key path, era só usar users.map { $0.email } para obter um array de emails, ou similarmente usar users.filter { $0.isActive } para obter um array de users ativos.

Com o key path, agora é possível usar users.map(\.email) para obter um array de emails, ou users.map { $0[keyPath: \User.email] } para obter um array de users ativos.

O Swift 5.2 também traz uma nova arquitetura de diagnósticos projetada para melhorar a qualidade e precisão das mensagens de erros quando um desenvolvedor cometer algum erro codificando. Vamos explorar alguns exemplos de diagnósticos não tão claros antes da nova arquitetura de diagnósticos, e como isso está no Swift 5.2:

Unwrap de um Optional inválido

struct S { init(_: [T]) {} } var i = 42 _ = S([i!])

Anteriormente, o resultado era error: type of expression is ambiguous without more context, e agora é diagnosticado como error: cannot force unwrap value of non-optional type 'Int' _ = S<Int>([i!]) ~^.

Incompatibilidade na conversão Argument-to-Parameter

import SwiftUI struct Foo: View { var body: some View { ForEach(1...5) { Circle().rotation(.degrees($0)) } } }

Anteriormente, o resultado era error: Cannot convert value of type '(Double) -> RotatedShape<Circle>' to expected argument type '() -> _', e agora é diagnosticado como error: cannot convert value of type 'Int' to expected argument type 'Double' Circle().rotation(.degrees($0)) ^ Double( ).

Outras funcionalidades não relacionadas diretamente ao Swift 5.2, mas que valem a pena mencionar são:

  • O Xcode 11.4 beta suporta a criação e distribuição de aplicativos macOS como universal purchase. O Universal purchase é habilitado por padrão para novas apps criadas para o novo Mac Catalyst no Xcode 11.4;
  • O Build settings tem um novo operador default, que permite que os desenvolvedores especifiquem um valor padrão de uma configuração de compilação, se for avaliada como nula no contexto da avaliação, como por exemplo $(SETTING:default=something).

Para maiores informações, assim como a lista completa de funcionalidades, correções de bugs e issues conhecidas podem ser encontradas no release notes do Xcode 11.4 beta.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT