Como deixar de ter medo de deprecated e amar o slicing em Swift
Se você já escreveu código em Swift e tentou cortar parte de uma string, certamente já se deparou com esta mensagem assustadora: 'substring(to:)' is deprecated: Please use String slicing subscript with a 'partial range from' operator. Parece uma sentença? Na verdade, é um convite para um mundo novo, mais seguro e poderoso de trabalhar com strings. Vamos entender o que aconteceu, por que a Apple decidiu mudar a API familiar e como agora "cortar" strings corretamente no Swift 4 e versões posteriores.
Por que o substring ficou no passado?
O bom e velho substring(to:) funcionava, mas não era... muito inteligente. Ele retornava um novo objeto Substring que, na prática, era apenas uma "janela" para a string original. Isso gerava confusão: você achava que estava trabalhando com uma string independente, mas na verdade mantinha uma referência à memória antiga. No Swift 4, decidiram organizar as coisas: agora todas as operações com substrings retornam o tipo Substring, e para obter uma string completa, é necessário converter explicitamente o resultado. Parece mais complicado? Na prática, é muito mais claro e seguro.
Conheça: String slicing subscript
A nova abordagem usa subscripts e ranges (intervalos). Em vez dos métodos substring(to:), substring(from:) e substring(with:), você agora escreve código que se parece com a manipulação de arrays. Aqui está uma analogia básica:
let fullString = "Olá, mundo!"// Método antigo (deprecated)// let oldResult = fullString.substring(to: fullString.index(fullString.startIndex, offsetBy: 4))
// Novo métodolet newResult = fullString[..<fullString.index(fullString.startIndex, offsetBy: 4)]print(newResult) // "Olá"Viu o operador ..<? Este é o famoso partial range from operator — um intervalo parcial "do início até o índice especificado, sem incluí-lo". Poderoso, não?
Os três pilares da nova abordagem: from, to, through
Vamos analisar os três cenários principais que antes eram cobertos pelos métodos substring.
1. substring(to:) → prefix(upTo:) ou intervalo parcial
Quer pegar tudo até um determinado índice? Use ..< (half-open range) ou o método prefix(upTo:):
let str = "Olá, Swift"let index = str.firstIndex(of: ",") ?? str.endIndex
// Opção com subscriptlet result1 = str[..<index]print(result1) // "Olá"
// Opção com métodolet result2 = str.prefix(upTo: index)print(result2) // "Olá"2. substring(from:) → suffix(from:) ou intervalo parcial
Precisa pegar tudo de um índice até o final? Use ... (closed range) com o início omitido:
let startIndex = str.index(str.startIndex, offsetBy: 5)let result3 = str[startIndex...]print(result3) // "Swift"
// Ou com métodolet result4 = str.suffix(from: startIndex)print(result4) // "Swift"3. substring(with:) → intervalo comum
Quer cortar um trecho específico? Basta especificar o intervalo:
let range = str.index(str.startIndex, offsetBy: 5)..<str.endIndexlet result5 = str[range]print(result5) // "Swift"
// Ou com closed rangelet closedRange = str.index(str.startIndex, offsetBy: 5)...str.index(before: str.endIndex)let result6 = str[closedRange]print(result6) // "Swift"Observe: todas essas operações retornam Substring, não String. Se você precisar de uma string completa, basta envolver o resultado em String():
let newString = String(result1)print(type(of: newString)) // StringE o prefix e suffix? Eles não estão obsoletos!
Sim, os métodos prefix(_:), suffix