Accès juste en arrière
Le meilleur moyen est d'utiliser substringToIndex
combiné à la endIndex
propriété et à la advance
fonction globale.
var string1 = "www.stackoverflow.com"
var index1 = advance(string1.endIndex, -4)
var substring1 = string1.substringToIndex(index1)
A la recherche d'une corde partant de l'arrière
Utiliser rangeOfString
et régler options
sur.BackwardsSearch
var string2 = "www.stackoverflow.com"
var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex
var substring2 = string2.substringToIndex(index2!)
Pas d'extensions, Swift idiomatique pur
Swift 2.0
advance
fait maintenant partie de Index
et est appelé advancedBy
. Vous le faites comme:
var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)
Swift 3.0
Vous ne pouvez pas appeler advancedBy
a String
car il contient des éléments de taille variable. Vous devez utiliser index(_, offsetBy:)
.
var string1 = "www.stackoverflow.com"
var index1 = string1.index(string1.endIndex, offsetBy: -4)
var substring1 = string1.substring(to: index1)
Beaucoup de choses ont été renommées. Les cas sont écrits en camelCase, startIndex
est devenu lowerBound
.
var string2 = "www.stackoverflow.com"
var index2 = string2.range(of: ".", options: .backwards)?.lowerBound
var substring2 = string2.substring(to: index2!)
De plus, je ne recommanderais pas le déballage forcé index2
. Vous pouvez utiliser la liaison facultative ou map
. Personnellement, je préfère utiliser map
:
var substring3 = index2.map(string2.substring(to:))
Swift 4
La version Swift 3 est toujours valide mais vous pouvez désormais utiliser des indices avec des plages d'index:
let string1 = "www.stackoverflow.com"
let index1 = string1.index(string1.endIndex, offsetBy: -4)
let substring1 = string1[..<index1]
La deuxième approche reste inchangée:
let string2 = "www.stackoverflow.com"
let index2 = string2.range(of: ".", options: .backwards)?.lowerBound
let substring3 = index2.map(string2.substring(to:))
string1.endIndex.advancedBy(-4)
ça marche pour moi au lieu deadvance
NSString
est évidemment mauvaise, aussi, parce que finalement nous voulons tous nous éloigner des classes de la Fondation (héritage). Alors ... plus de déclamations!string1[..<index1]
. Pas besoin destring1.startIndex
.Swift 3, XCode 8
Depuis
advancedBy(Int)
est parti depuis que Swift 3 utiliseString
la méthodeindex(String.Index, Int)
. Découvrez cetteString
extension avec sous-chaîne et amis:Extension MISE À JOUR pour Swift 4
Usage:
PS Il est vraiment étrange que les développeurs soient obligés de faire face au
String.Index
lieu de plaineInt
. Pourquoi devrions-nous nous préoccuper de laString
mécanique interne et pas seulement avoir dessubstring()
méthodes simples ?la source
encodedOffset
vérifier ce commentaire et la bonne façon d'accomplir cela stackoverflow.com/questions/34540185/...Je le ferais en utilisant un indice (
s[start..<end]
):Swift 3, 4, 5
la source
modifier / mettre à jour:
Dans Swift 4 ou version ultérieure (Xcode 10.0+), vous pouvez utiliser la nouvelle méthode BidirectionalCollection lastIndex (of :)
la source
Voici comment je fais. Vous pouvez le faire de la même manière ou utiliser ce code pour des idées.
Voici les extensions que j'utilise:
Crédit albertbori / Extensions de cordes Swift communes
En général, je suis un fervent partisan des extensions, en particulier pour des besoins tels que la manipulation de chaînes, la recherche et le découpage.
la source
String
a une fonction de sous-chaîne intégrée:Si vous voulez "aller au premier index d'un caractère", vous pouvez obtenir la sous-chaîne en utilisant la
find()
fonction intégrée :Pour trouver le dernier index, nous pouvons implémenter
findLast()
.AJOUTÉE:
Peut-être que la
BidirectionalIndexType
version spécialisée defindLast
est plus rapide:la source
Vous pouvez utiliser ces extensions:
Swift 2.3
Swift 3
Usage:
la source
Swift 4:
vous pouvez le tester comme suit:
Consultez la bibliothèque https://gitlab.com/seriyvolk83/SwiftEx . Il contient ces méthodes et d'autres méthodes utiles.
la source
Voulez-vous obtenir une sous-chaîne d'une chaîne depuis l'index de début jusqu'au dernier index de l'un de ses caractères? Si tel est le cas, vous pouvez choisir l'une des méthodes Swift 2.0+ suivantes.
Méthodes qui nécessitent
Foundation
Obtenez une sous-chaîne qui inclut le dernier index d'un caractère:
Obtenez une sous-chaîne qui n'inclut PAS le dernier index d'un caractère:
Si vous devez répéter ces opérations, l'extension
String
peut être une bonne solution:Méthodes qui NE nécessitent PAS
Foundation
Obtenez une sous-chaîne qui inclut le dernier index d'un caractère:
Obtenez une sous-chaîne qui n'inclut PAS le dernier index d'un caractère:
Si vous devez répéter ces opérations, l'extension
String
peut être une bonne solution:la source
Voici un moyen simple et rapide d'obtenir une sous-chaîne si vous connaissez l'index:
L'application ne plantera pas si votre index dépasse la longueur de la chaîne:
Les deux exemples sont prêts pour Swift 3 .
la source
La seule chose qui ajoute du bruit est la répétition
stringVar
:stringVar [ stringVar .index ( stringVar .startIndex, offsetBy: ...)
Dans Swift 4
Une extension peut en réduire une partie:
Ensuite, utilisation:
Il convient de noter que
to
etfrom
sont de typeSubstring
(ouString.SubSequance
). Ils n'allouent pas de nouvelles chaînes et sont plus efficaces pour le traitement.Pour récupérer un
String
type, ilSubstring
doit être renvoyé versString
:C'est là qu'une chaîne est finalement allouée.
la source
la source
Swift 3
Bon article pour comprendre, pourquoi avons-nous besoin de cela
la source
J'ai étendu String avec deux méthodes de sous-chaîne. Vous pouvez appeler la sous-chaîne avec une plage from / to ou from / length comme ceci:
la source
Swift 2.0 Le code ci-dessous est testé sur XCode 7.2. Veuillez vous référer à la capture d'écran ci-jointe en bas
la source
Dans Swift 5
Nous avons besoin
String.Index
au lieu d'une simple valeur Int pour représenter Index.Rappelez-vous également que lorsque nous essayons d'obtenir des sous-chaînes de Swift
String
(type valeur), nous devons en fait itérer avec leSequence
protocole, qui renvoie leString.SubSequence
type au lieu duString
type.Pour revenir à
String
partirString.SubSequence
, l' utilisationString(subString)
Exemple comme ci-dessous:
la source
Pour Swift 2.0 , c'est comme ça:
la source
J'ai modifié le post d'Andrewz pour le rendre compatible avec Swift 2.0 (et peut-être Swift 3.0). À mon humble avis, cette extension est plus facile à comprendre et similaire à ce qui est disponible dans d'autres langages (comme PHP).
la source
J'ai également construit une simple extension de chaîne pour Swift 4:
Ainsi, vous pouvez facilement l'appeler comme ceci:
la source
Essayez cette
Int-based
solution de contournement:Remarque: ce n'est qu'une pratique. Cela ne vérifie pas la frontière. Modifiez selon vos besoins.
la source
Voici un moyen simple d'obtenir une sous-chaîne dans Swift
la source