Quiero eliminar el primer carácter de una cadena. Hasta ahora, lo más sucinto que se me ha ocurrido es:
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))
Sé que no podemos indexar en una cadena con un Int
debido a Unicode, pero esta solución parece muy detallada. ¿Hay otra forma en que estoy pasando por alto?
advance
lanzandodisplay.text!
a NSString. No digo que sea una buena solución, solo corregir un posible error. Con NSString, puede indexarlo con Int. - Y la razón por la que no puede indexar con Int no es por Unicode; es porque un personaje puede constar de varios puntos de código compuestos.String
entonces Swift 3 ha introducido lacapitalized
funciónString
.Respuestas:
Si está usando Swift 3 , puede ignorar la segunda sección de esta respuesta. La buena noticia es que ahora esto es realmente conciso nuevamente. Simplemente usando el nuevo método remove (at :) de String.
Me gusta la
dropFirst()
función global para esto.Es breve, claro y funciona para cualquier cosa que se ajuste al protocolo Sliceable.
Si está usando Swift 2 , esta respuesta ha cambiado. Aún puede usar dropFirst, pero no sin eliminar el primer carácter de su
characters
propiedad strings y luego convertir el resultado de nuevo en String. dropFirst también se ha convertido en un método, no en una función.Otra alternativa es usar la función de sufijo para empalmar la cadena
UTF16View
. Por supuesto, esto también debe convertirse nuevamente en una cadena.Todo esto es para decir que la solución que proporcioné originalmente ha resultado no ser la forma más sucinta de hacer esto en las versiones más nuevas de Swift. Recomiendo recurrir a la solución de @chris
removeAtIndex()
si está buscando una solución breve e intuitiva.Y como lo señaló @vacawama en los comentarios a continuación, otra opción que no modifica el String original es usar substringFromIndex.
O si está buscando eliminar un carácter del principio y el final de la Cadena, puede usar substringWithRange. Solo asegúrese de protegerse contra la condición cuando
startIndex + n > endIndex - m
.La última línea también se puede escribir usando notación de subíndice.
fuente
remove(at:)
método: es el carácter eliminado, no la nueva cadena. Por ejemplolet removedCharacter = myString.remove(at: myString.startIndex)
,. Cometí el error de devolver el resultado de la llamada al método, olvidando que este era el caso en este enfoque. ¡Feliz codificación de todos!Actualización para Swift 4
En Swift 4, se
String
ajusta deCollection
nuevo, por lo que es posible utilizardropFirst
ydropLast
recortar los inicios y finales de cadenas. El resultado es de tipoSubstring
, por lo que debe pasarlo alString
constructor para obtener unString
:dropFirst()
ydropLast()
también tome anInt
para especificar la cantidad de caracteres que se eliminarán:Si especifica más caracteres para eliminar de los que hay en la cadena, el resultado será la cadena vacía (
""
).Actualización para Swift 3
Si solo desea eliminar el primer carácter y desea cambiar la cadena original en su lugar, consulte la respuesta de @ MickMacCallum. Si desea crear una nueva cadena en el proceso, use
substring(from:)
. Con una extensión deString
, puede ocultar la fealdad desubstring(from:)
ysubstring(to:)
crear adiciones útiles para recortar el comienzo y el final de unString
:Como
dropFirst
ydropLast
antes que ellos, estas funciones fallarán si no hay suficientes letras disponibles en la Cadena. La persona que llama tiene la responsabilidad de utilizarlos correctamente. Ésta es una decisión de diseño válida. Uno podría escribirlos para devolver un opcional que luego tendría que ser desenvuelto por la persona que llama.Swift 2.x
Por desgracia en Swift 2 ,
dropFirst
ydropLast
(la mejor solución anterior) no son tan convenientes como lo eran antes. Con una extensión deString
, puede ocultar la fealdad desubstringFromIndex
ysubstringToIndex
:Me gusta
dropFirst
ydropLast
antes que ellos, estas funciones fallarán si no hay suficientes letras disponibles en la Cadena. La persona que llama tiene la responsabilidad de utilizarlos correctamente. Ésta es una decisión de diseño válida. Uno podría escribirlos para devolver un opcional que luego tendría que ser desenvuelto por la persona que llama.En Swift 1.2 , deberá llamar
chopPrefix
así:o puede agregar un guión bajo
_
a las definiciones de función para suprimir el nombre del parámetro:fuente
Swift 2.2
Swift 3.0
Swift 3.2
Rápido 4
fuente
En Swift 2, haz esto:
Recomiendo https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html para comprender las cadenas Swift.
fuente
Depende de cuál desee que sea el resultado final (mutante o no mutante).
A partir de Swift 4.1:
Mutante:
No mutante:
Notas:
nonmutating
ejemplo para mayor claridad. Subjetivamente, combinar los dos últimos pasos sería más sucinto.dropFirst
parece un poco extraño porque si entiendo correctamente las Pautas de diseño de la API de Swift ,dropFirst
debería ser algo asídropingFirst
porque no es mutante. Solo un pensamiento :).fuente
droppingFirst
- ¡se equivocaron!¿Qué pasa con esto?
Esto, por supuesto, asume que su cadena es mutable. Devuelve el carácter que se ha eliminado, pero altera la cadena original.
fuente
Las respuestas anteriores son bastante buenas, pero a partir de hoy, creo que esta puede ser la forma más sucinta de eliminar el primer carácter de una cadena en Swift 4 :
fuente
No conozco nada más sucinto listo para usar, pero podría implementar fácilmente el prefijo
++
, por ejemplo,Después de lo cual puede usarlo al contenido de su corazón de manera muy sucinta:
fuente
En Swift 2 use esta extensión de cadena:
fuente
fuente
Para eliminar el primer carácter de la cadena
fuente
Aquí hay una versión guardada de Swift4 de la
chopPrefix
extensión, dejandochopSuffix
a la comunidad ...fuente
Swift3
fuente