aviso: 'caracteres' está obsoleto: use String ou Substring diretamente

162

caracteres - uma propriedade de instância de String, foi preterida no Xcode 9.1

Foi muito útil obter uma substring de String usando a characterspropriedade, mas agora ela foi preterida e o Xcode sugere o uso substring. Tentei verificar as questões SO e os tutoriais / diretrizes para desenvolvedores da Apple sobre o mesmo. Mas não conseguiu ver nenhuma solução / alternativa, conforme sugerido.

Aqui está a mensagem de aviso:

'caracteres' foi descontinuado: use String ou Substring

insira a descrição da imagem aqui

Eu tenho tantas operações de cadeia são realizados / manuseado usando a propriedade characters.

Alguém tem alguma ideia / informação sobre esta atualização?

Krunal
fonte
5
Aqui está um artigo interessante sobre as Stringmudanças de Swift 3 para 4 e leia também SE0163
vadian
5
tente usar em seu countlugar.
holex
1
Se você estava usando string.characters.forEacha nova API éstring.forEach { char in process(char) }
Efren

Respostas:

270

O Swift 4 introduziu alterações na API da string.
Você pode apenas usar em !stringValue.isEmptyvez destringValue.characters.count > 0

para obter mais informações, obtenha a amostra daqui

por exemplo

let edit = "Summary"
edit.count   // 7
songxunzhao
fonte
Obrigado pela sua resposta .. Mas posso ter referência detalhada da sub string. Este é apenas um exemplo de exemplo, eu tenho muitas outras operações lidando com personagens
Krunal
1
Verifique informações detalhadas aqui. developer.apple.com/library/content/documentation/Swift/…
songxunzhao
deixe saudação = "Olá, mundo!" deixe index = greeting.index (de: ",") ?? greeting.endIndex let
begin
1
Referência online para Substring .
Dennis Vennink 28/09
32
Nunca use count> 0 para verificar se uma coleção está vazia. Existe uma propriedade na coleção chamada isEmpty exatamente para isso. Dos documentos Quando você precisar verificar se sua coleção está vazia, use a propriedade isEmpty em vez de verificar se a propriedade count é igual a zero. Para coleções que não estão em conformidade com RandomAccessCollection, o acesso à propriedade count itera através dos elementos da coleção.
Leo Dabus 28/09
82

Exemplos do Swift 4 vs Swift 3:

let myString = "test"

for char in myString.characters {print(char) } // Swift 3
for char in myString { print(char) } // Swift 4

let length = myString.characters.count // Swift 3
let length = myString.count // Swift 4
Mohammad Sadegh Panadgoo
fonte
2
Essa deve ser a resposta aceita. A questão é sobre a substituição de string.characters.count, não a substituição por comparação com zero; isso é mencionado apenas na captura de tela.
Timothy Kanski 07/02/19
9

Um dos casos mais comuns para manipular seqüências de caracteres é com respostas JSON. Neste exemplo, criei uma extensão no meu aplicativo de exibição para descartar os últimos (n) caracteres de um objeto Bitcoin JSON.

Swift 3:

func dropLast(_ n: Int = 0) -> String {
    return String(characters.dropLast(n))

Mensagem de erro do Xcode 9.1:

'caracteres' foi descontinuado: use String ou Substring diretamente

O Xcode está nos dizendo para usar a variável ou método de string diretamente .

Swift 4:

func dropLast(_ n: Int = 0) -> String {
    return String(dropLast(n))
    }

Extensão completa:

extension String {
    func dropLast(_ n: Int = 0) -> String {
        return String(dropLast(n))
    }

    var dropLast: String {
        return dropLast()
    }
}

Ligar:

print("rate:\(response.USDRate)")
let literalMarketPrice = response.USDRate.dropLast(2)
print("literal market price: \(literalMarketPrice)")

Console:

//rate:7,101.0888 //JSON float
//literal market price: 7,101.08 // JSON string literal

Exemplos adicionais:

  • print("Spell has \(invisibleSpellName.count) characters.")
  • return String(dropLast(n))
  • return String(removeLast(n))

Documentação:

Muitas vezes você vai estar usando métodos comuns, como dropLast()ou removeLast()ou countentão aqui está a documentação da Apple explícita para cada método.

droplast ()

removelast ()

contando caracteres

Edison
fonte
2

Esse aviso é apenas o topo do iceberg, houve muitas alterações nas cordas, as cordas são novamente uma coleção de caracteres, mas temos algo novo e legal, sub-cordas :)

Esta é uma ótima leitura sobre isso: https://useyourloaf.com/blog/updating-strings-for-swift-4/

Boris
fonte
2

Use isso charactersporque Stringdeixou de ser uma coleção no Swift 2.0. No entanto, esse código ainda é válido no Swift 4, mas não é mais necessário agora, pois Stringé um Collectionnovo.

Por exemplo, um Swift 4 Stringagora tem uma propriedade de contagem direta que fornece a contagem de caracteres:

// Swift 4
let spString = "Stack"
spString.count           // 5

Exemplos para String e SubString.

Corda

StringAgora, o Swift 4 obtém diretamente o elemento que fornece o primeiro caractere de String:(string.characters.first)

let spString = "Stack"
let firstElement = spString.first   //S

SubString

Usando SubString obtém o primeiro caractere.

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W
Pranavan Sp
fonte
Eu quero obter o primeiro caractere da string, então eu quero saber de que maneira eu devo usar let firstElement = spString.first ou Substring?
Pulkit
1
@Pulkit Melhor usar .firstporque se a string está ""vazia. retornará apenas zero, mas substringproduzirá erro.
Pranavan Sp
como converter esta linha de código para rápida 4 'AuthorImageText = String (val.characters [(AuthorName.startIndex)]) capitalizados.'
Pulkit
@Pulkit basta remover .characterso suficiente
Pranavan Sp
0

Você também pode usar este código para agrupar dicionários sem usar {$ 0.characters.first! }

let cities = ["Shanghai": 24_256_800, "Karachi": 23_500_000, "Beijing": 21_516_000, "Seoul": 9_995_000]
let groupedCities = Dictionary(grouping: cities.keys) { $0.first! }
print(groupedCities)
mahendra solanki
fonte
0

Basta remover caracteres. Por exemplo:

stringValue.characters.count para stringValue.count

Ayoub Bouya
fonte