A nova versão do Swift chega com várias mudanças e melhorias para a linguagem e suas bibliotecas, com destaque para as novas funcionalidades de String, extensões de collections, manipulação de arquivos, serialização e muito mais.
No Swift 4, as Strings se assemelham ao protocolo de Collections, tornando-as diretamente iterável, além de fornecer todas as facilidades que você está acostumado com collections e sequences. Por exemplo:
for c in myString {
print(c)
}
myString.filter { c in
return boolCheck(c)
}
let l = myString.count
let myString2 = myString.dropFirst()
Além disso, os particionamentos de strings agora são instâncias do tipo Substring, assemelhando-se ao StringProtocol, podendo assim ser usado de forma idêntica ao tipo String. Está mudança proporcionou uma melhora em performance para a separação de strings, já que o tipo Substring não irá copiar a partição da String original. A operação de cópia agora é feita quando a Substring for convertida a uma String para ser consumida por uma API.
Outra nova funcionalidade de String é o suporte para Unicode 9 e literais de cadeia múltipla.
O Swift 4 também melhorou o modo que você cria, usa e manipula tipos variados de collections, como por exemplo os tipos Set e Dictionary.
Primeiro de tudo, você pode criar um Dictionary a partir de uma sequência de tuplas, bem como especificar como será o tratamento para duplicações, se houver, tanto na criação de um Dictionary ou na fusão de dois Dictionary:
let items = ["ItemA", "ItemB", "ItemC", "ItemA"]
let prices = [14.40, 41.63, 3.71, 15.63]
let catalog1 = Dictionary(uniqueKeysWithValues: zip(items, prices))
let catalog2 = Dictionary(prices, uniquingKeysWith: { (l, r) in
l })
let catalog3 = Dictionary(prices, uniquingKeysWith: { (l, r) in
l + r })
let merged = catalog.merge(catalog3) { (l, r) in r }
Dictionary e Set agora podem ser filtrados sobre um objeto de mesmo tipo que o seu tipo original, ao invés de ser através de um Array. Além disso, dicionários de dados (Dictionary) tem um novo método chamado mapValues:
let catalog4 = catalog.filter { $0.value < 15.0 }
let catalog5 = catalog.mapValues { $0 * 1.2 }
Outra funcionalidade bastante útil para os dicionários de dados é a possibilidade de definir valores padrões para determinados elementos, que faz o operador retornar um tipo non-opt:
let price1 : Float = catalog['none', default: 0.0]
let price2 : Float? = catalog['none']
Na versão 4, todos os tipos de collections suportam generic subscripts. Isso significa que você pode definir a seguinte estrutura JSON e não lançar o resultado da indexação no dicionário de dados.
struct JSON {
init(dictionary: [String:Any]) {
...
}
subscript(key: String) -> T? {
...
}
}
let json = ...
let result: String? = json['item']
Outro aprimoramento bem-vindo para a linguagem é o suporte para arquivamento e serialização, que antes exigia lidar com NSObject e NSCoding, o que não é uma opção para que os tipos Enum interpretem. Como alternativa, o Swift 4 adiciona serialização a todos os tipos através do protocolo Codable. Ole Begemann fez uma boa introdução à codificação e decodificação em Swift 4. Por exemplo, esta é uma maneira de definir um tipo Codable:
struct Card: Codable, Equatable {
enum Suit: String, Codable {
case clubs, spades, hearts, diamonds
}
enum Rank: Int, Codable {
case two = 2, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace
}
var suit: Suit
var rank: Rank
static func ==(lhs: Card, rhs: Card) -> Bool {
return lhs.suit == rhs.suit && lhs.rank == rhs.rank
}
}
let hand = [Card(suit: .clubs, rank: .ace), Card(suit: .hearts, rank: .queen)]
Como última nota, o Swift 4 agora tem dois modos de linguagem, configurável pela opção -swift-version do compilador. No modo Swift 3.2, o compilador aceitará a maioria das fontes compatíveis com os compiladores Swift 3.x. Neste modo, a maioria das funcionalidades do Swift 4 estarão disponíveis, mas terão atualizações para as APIs anteriores. Já no modo Swift 4.0, estarão disponíveis todas as novas funcionalidades do Swift 4, às custas de algumas mudanças em algumas bibliotecas, que podem facilmente serem tratadas usando o assistente de migração do Xcode.
Tem muitas outras funcionalidades no Swift 4. Não perca o anúncio de Ted Kremenek, maintainer do Swift, e o playground interativo de Ole Begemann, que demonstra todos os novos recursos.
O Swift 4 já está disponível no Xcode 9 e pode ser instalado manualmente no Xcode 8.3.