Solo accediendo hacia atrás
La mejor forma es utilizarlo substringToIndex
combinado con la endIndex
propiedad y la advance
función global.
var string1 = "www.stackoverflow.com"
var index1 = advance(string1.endIndex, -4)
var substring1 = string1.substringToIndex(index1)
Buscando una cuerda empezando por la espalda
Usar rangeOfString
y configurar options
en.BackwardsSearch
var string2 = "www.stackoverflow.com"
var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex
var substring2 = string2.substringToIndex(index2!)
Sin extensiones, Swift puramente idiomático
Swift 2.0
advance
ahora es parte de Index
y se llama advancedBy
. Lo haces como:
var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)
Swift 3.0
No puede llamar advancedBy
a String
porque tiene elementos de tamaño variable. Tienes que usar index(_, offsetBy:)
.
var string1 = "www.stackoverflow.com"
var index1 = string1.index(string1.endIndex, offsetBy: -4)
var substring1 = string1.substring(to: index1)
Se ha cambiado el nombre de muchas cosas. Los casos están escritos en camelCase, se startIndex
convirtió lowerBound
.
var string2 = "www.stackoverflow.com"
var index2 = string2.range(of: ".", options: .backwards)?.lowerBound
var substring2 = string2.substring(to: index2!)
Además, no recomendaría desenvolver a la fuerza index2
. Puede utilizar enlace opcional o map
. Personalmente, prefiero usar map
:
var substring3 = index2.map(string2.substring(to:))
Rápido 4
La versión Swift 3 sigue siendo válida, pero ahora puede usar subíndices con rangos de índices:
let string1 = "www.stackoverflow.com"
let index1 = string1.index(string1.endIndex, offsetBy: -4)
let substring1 = string1[..<index1]
El segundo enfoque permanece sin cambios:
let string2 = "www.stackoverflow.com"
let index2 = string2.range(of: ".", options: .backwards)?.lowerBound
let substring3 = index2.map(string2.substring(to:))
string1.endIndex.advancedBy(-4)
me está funcionando en lugar deadvance
NSString
es obviamente mala también, porque eventualmente todos queremos alejarnos de las clases de la Fundación (legado). Entonces ... ¡más despotricar!string1[..<index1]
. No es necesariostring1.startIndex
.Swift 3, XCode 8
Dado que
advancedBy(Int)
se ha ido desdeString
el método de uso de Swift 3index(String.Index, Int)
. Mira estaString
extensión con subcadena y amigos:Extensión ACTUALIZADA para Swift 4
Uso:
PD: Es realmente extraño que los desarrolladores se vean obligados a tratar en
String.Index
lugar de hacerlo simpleInt
. ¿Por qué deberíamos preocuparnos por laString
mecánica interna y no solo tenersubstring()
métodos simples ?fuente
encodedOffset
verificar este comentario y la forma correcta de lograrlo stackoverflow.com/questions/34540185/…Lo haría usando un subíndice (
s[start..<end]
):Rápido 3, 4, 5
fuente
editar / actualizar:
En Swift 4 o posterior (Xcode 10.0+) puede usar el nuevo método BidirectionalCollection lastIndex (of :)
fuente
Así es como lo hago. Puede hacerlo de la misma manera o usar este código para obtener ideas.
Aquí están las extensiones que uso:
Crédito albertbori / Extensiones de cadenas Swift comunes
Generalmente soy un firme defensor de las extensiones, especialmente para necesidades como manipulación, búsqueda y corte de cadenas.
fuente
String
tiene una función de subcadena incorporada:Si lo que desea es "ir al primer índice de un carácter", puede obtener la subcadena usando la
find()
función incorporada :Para encontrar el último índice, podemos implementar
findLast()
.ADICIONAL:
Quizás, la
BidirectionalIndexType
versión especializada defindLast
es más rápida:fuente
Puedes usar estas extensiones:
Swift 2.3
Swift 3
Uso:
fuente
Rápido 4:
puedes probarlo de la siguiente manera:
Consulte la biblioteca https://gitlab.com/seriyvolk83/SwiftEx . Contiene estos y otros métodos útiles.
fuente
¿Desea obtener una subcadena de una cadena desde el índice de inicio hasta el último índice de uno de sus caracteres? Si es así, puede elegir uno de los siguientes métodos Swift 2.0+.
Métodos que requieren
Foundation
Obtenga una subcadena que incluya el último índice de un carácter:
Obtenga una subcadena que NO incluya el último índice de un carácter:
Si necesita repetir esas operaciones, extender
String
puede ser una buena solución:Métodos que NO requieren
Foundation
Obtenga una subcadena que incluya el último índice de un carácter:
Obtenga una subcadena que NO incluya el último índice de un carácter:
Si necesita repetir esas operaciones, extender
String
puede ser una buena solución:fuente
A continuación, se muestra una forma fácil y breve de obtener una subcadena si conoce el índice:
No bloqueará la aplicación si su índice excede la longitud de la cadena:
Ambos ejemplos están listos para Swift 3 .
fuente
Lo único que agrega ruido es lo repetido
stringVar
:stringVar [ stringVar .index ( stringVar .startIndex, offsetBy: ...)
En Swift 4
Una extensión puede reducir algo de eso:
Entonces, uso:
Cabe señalar que
to
yfrom
son de tipoSubstring
(oString.SubSequance
). No asignan nuevas cadenas y son más eficientes para el procesamiento.Para recuperar un
String
tipo, esSubstring
necesario volver a convertirlo enString
:Aquí es donde finalmente se asigna una cadena.
fuente
fuente
Swift 3
Buen artículo para entender, ¿por qué necesitamos esto?
fuente
He extendido String con dos métodos de subcadena. Puede llamar a la subcadena con un rango desde / hasta o desde / longitud así:
fuente
Swift 2.0 El siguiente código se prueba en XCode 7.2. Consulte la captura de pantalla adjunta en la parte inferior.
fuente
En Swift 5
Necesitamos en
String.Index
lugar de un valor Int simple para representar Index.También recuerde, cuando intentamos obtener subString de Swift
String
(tipo de valor), en realidad tenemos que iterar con elSequence
protocolo, que devuelveString.SubSequence
tipo en lugar deString
tipo.Para volver
String
deString.SubSequence
, useString(subString)
Ejemplo de la siguiente manera:
fuente
Para Swift 2.0 , es así:
fuente
Modifiqué la publicación de andrewz para que sea compatible con Swift 2.0 (y tal vez Swift 3.0). En mi humilde opinión, esta extensión es más fácil de entender y similar a lo que está disponible en otros lenguajes (como PHP).
fuente
También creo una extensión de cadena simple para Swift 4:
Entonces puedes llamarlo fácilmente así:
fuente
Pruebe esta
Int-based
solución alternativa:Nota: es solo una práctica. No comprueba el límite. Modifique para satisfacer sus necesidades.
fuente
Aquí hay una forma sencilla de obtener subcadenas en Swift
fuente