Solo accediendo hacia atrás
La mejor forma es utilizarlo substringToIndexcombinado con la endIndexpropiedad y la advancefunció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 rangeOfStringy configurar optionsen.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
advanceahora es parte de Indexy 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 advancedBya Stringporque 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 startIndexconvirtió 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 deadvanceNSStringes 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 desdeStringel método de uso de Swift 3index(String.Index, Int). Mira estaStringextensió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.Indexlugar de hacerlo simpleInt. ¿Por qué deberíamos preocuparnos por laStringmecánica interna y no solo tenersubstring()métodos simples ?fuente
encodedOffsetverificar 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
Stringtiene 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
BidirectionalIndexTypeversión especializada defindLastes 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
FoundationObtenga 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
Stringpuede ser una buena solución:Métodos que NO requieren
FoundationObtenga 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
Stringpuede 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
toyfromson de tipoSubstring(oString.SubSequance). No asignan nuevas cadenas y son más eficientes para el procesamiento.Para recuperar un
Stringtipo, esSubstringnecesario 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.Indexlugar 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 elSequenceprotocolo, que devuelveString.SubSequencetipo en lugar deStringtipo.Para volver
StringdeString.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-basedsolució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