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.