avertissement: 'characters' est obsolète: veuillez utiliser directement String ou Substring

162

caractères - une propriété d'instance de String, est obsolète depuis avec Xcode 9.1

Il était très utile d'obtenir une sous-chaîne à partir de String en utilisant la characterspropriété, mais maintenant elle est obsolète et Xcode suggère de l'utiliser substring. J'ai essayé de vérifier les questions SO et les tutoriels / directives des développeurs Apple pour la même chose. Mais je n'ai pas pu voir de solution / alternative comme suggéré.

Voici un message d'avertissement:

'characters' est obsolète: veuillez utiliser une chaîne ou une sous-chaîne

entrez la description de l'image ici

J'ai tellement d'opérations de chaîne sont effectuées / gérées en utilisant la propriété characters.

Quelqu'un a-t-il des idées / informations sur cette mise à jour?

Krunal
la source
5
Voici un article intéressant sur les Stringchangements de Swift 3 à 4 et veuillez lire aussi SE0163
vadian
5
essayez d'utiliser à la countplace.
holex
1
Si vous utilisiez string.characters.forEachla nouvelle API eststring.forEach { char in process(char) }
Efren

Réponses:

270

Swift 4 a introduit des modifications sur l'API de chaîne.
Vous pouvez simplement utiliser à la !stringValue.isEmptyplace destringValue.characters.count > 0

pour plus d'informations, vous obtenez l'exemple d' ici

par exemple

let edit = "Summary"
edit.count   // 7
songxunzhao
la source
Merci pour votre réponse. Mais puis-je avoir la référence détaillée de la sous-chaîne. Ceci n'est qu'un exemple d'exemple, j'ai tellement d'autres opérations traitant des personnages
Krunal
1
Veuillez vérifier les informations détaillées d'ici. developer.apple.com/library/content/documentation/Swift/…
songxunzhao
let salutation = "Bonjour le monde!" let index = salut.index (sur: ",") ?? salutation.endIndex let
begin
1
Référence en ligne pour Substring .
Dennis Vennink
32
N'utilisez jamais count> 0 pour vérifier si une collection est vide. Il existe une propriété sur Collection appelée isEmpty exactement pour cela. À partir de la documentation Lorsque vous devez vérifier si votre collection est vide, utilisez la propriété isEmpty au lieu de vérifier que la propriété count est égale à zéro. Pour les collections qui ne sont pas conformes à RandomAccessCollection, l'accès à la propriété count effectue une itération dans les éléments de la collection.
Leo Dabus
82

Exemples de 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
la source
2
Cela devrait être la réponse acceptée. La question concerne le remplacement de string.characters.count, pas le remplacement de la comparaison à zéro; cela n'est mentionné que dans la capture d'écran.
Timothy Kanski
9

L'un des cas les plus courants de manipulation de chaînes est celui des réponses JSON. Dans cet exemple, j'ai créé une extension dans mon application de montre pour supprimer les (n) derniers caractères d'un objet JSON Bitcoin.

Swift 3:

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

Message d'erreur Xcode 9.1:

'characters' est obsolète: veuillez utiliser directement String ou Substring

Xcode nous dit d'utiliser directement la variable chaîne ou la méthode .

Swift 4:

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

Extension complète:

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

    var dropLast: String {
        return dropLast()
    }
}

Appel:

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

Exemples supplémentaires:

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

Documentation:

Vous utiliserez souvent des méthodes courantes telles que dropLast()ou removeLast()ou countalors voici la documentation Apple explicite pour chaque méthode.

droplast ()

removelast ()

compter les caractères

Edison
la source
2

Cet avertissement n'est qu'un sommet de l'iceberg, il y a eu un butin de changements de chaîne, les chaînes sont à nouveau une collection de caractères, mais nous avons eu quelque chose de nouveau et cool, des sous-chaînes :)

C'est une excellente lecture à ce sujet: https://useyourloaf.com/blog/updating-strings-for-swift-4/

Boris
la source
2

Utilisez ceci charactersparce que Stringcessé d'être une collection dans Swift 2.0. Cependant, ce code est toujours valide dans Swift 4 mais n'est plus nécessaire maintenant que Stringc'est à Collectionnouveau.

Par exemple, un Swift 4 a Stringmaintenant une propriété de comptage direct qui donne le nombre de caractères:

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

Exemples pour String et SubString.

Chaîne

Swift 4 Stringobtient maintenant directement l'élément qui donne le premier caractère de String:(string.characters.first)

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

SubString

En utilisant SubString, obtenez le premier caractère.

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W
Pranavan Sp
la source
Je veux obtenir le premier caractère de la chaîne, donc je veux savoir de quelle manière dois-je utiliser let firstElement = spString.first ou Substring?
Pulkit
1
@Pulkit Mieux à utiliser .firstcar si la chaîne est ""vide. il ne retournera que nul mais substringproduira une erreur.
Pranavan Sp
comment convertir cette ligne de code en swift 4 'AuthorImageText = String (val.characters [(AuthorName.startIndex)]). capitalized'
Pulkit
@Pulkit enlève juste .charactersassez
Pranavan Sp
0

Vous pouvez également utiliser ce code pour le regroupement de dictionnaires sans utiliser {$ 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
la source
0

Supprimez simplement les caractères Par exemple:

stringValue.characters.count à stringValue.count

Ayoub Bouya
la source