Digamos que tengo una cadena aquí:
var fullName: String = "First Last"
Quiero dividir la base de la cadena en el espacio en blanco y asignar los valores a sus respectivas variables
var fullNameArr = // something like: fullName.explode(" ")
var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Además, a veces los usuarios pueden no tener un apellido.
fullName.utf8.split( <utf-8 character code> )
funciona (reemplace.utf8
con.utf16
UTF-16). Por ejemplo, la división+
podría hacerse usandofullName.utf8.split(43)
Respuestas:
La forma rápida es usar la
split
función global , así:con Swift 2
En Swift 2, el uso de split se vuelve un poco más complicado debido a la introducción del tipo interno de CharacterView. Esto significa que String ya no adopta los protocolos SequenceType o CollectionType y, en su lugar, debe usar la
.characters
propiedad para acceder a una representación de tipo CharacterView de una instancia de String. (Nota: CharacterView adopta los protocolos SequenceType y CollectionType).fuente
split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false)
.componentsSeparatedByString()
método anterior si su separador es más largo que un solo carácter. Y tan genial como sería decirlet (firstName, lastName) = split(fullName) {$0 == ' '}
, eso no funciona, lamentablemente.split("a,b;c,d") {$0 == "," || $0 == ";"}
osplit("a,b;c,d") {contains(",;", $0)}
Simplemente llame al
componentsSeparatedByString
método en sufullName
Actualización para Swift 3+
fuente
NSString
(Swift los intercambia automáticamente al importarFoundation
).[String]
) en Xcode 7.2.El método más fácil para hacer esto es mediante el uso de componentsSeparatedBy:
Para Swift 2:
Para Swift 3:
fuente
.componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
componentsSeparatedByString
ycomponentsSeparatedByCharactersInSet
Swift Dev. 4.0 (24 de mayo de 2017)
Una nueva función
split
en Swift 4 ( Beta ).Salida:
Acceso a valores:
Xcode 8.1 / Swift 3.0.1
Aquí está la forma en que varios delimitadores con matriz.
Salida:
fuente
import Foundation
a la clase en la que estás usando esto. #SavedYouFiveMinuteslet a="a,,b,c"
y la usaa.split(separator: ",")
, obtiene una matriz como["a", "b", c"]
por defecto. Esto se puede cambiar usando elomittingEmptySubsequences: false
que es verdadero por defecto.Swift 4 o posterior
Si solo necesita formatear correctamente el nombre de una persona, puede usar PersonNameComponentsFormatter .
editar / actualizar:
Swift 5 o posterior
Para dividir una cadena por caracteres que no sean letras, podemos usar la nueva propiedad Character
isLetter
:fuente
fullName.split { $0.isWhitespace }.map(String.init)
let words = line.split{ $0.isWhitespace }.map{ String($0)}
dividirme en el espacio en blanco en general), así que hice esto: Gracias @LeoDabus por su versión (mi comentario original no tenía código). También sugiero mover la versión Swift 5 a la parte superior de la respuesta.Como alternativa a la respuesta de WMios, también puede usar
componentsSeparatedByCharactersInSet
, lo que puede ser útil en el caso de que tenga más separadores (espacio en blanco, coma, etc.).Con su aporte específico:
Usando múltiples separadores:
fuente
,
o con;
cualquier otro separadorSwift 4
fuente
El problema del espacio en blanco
En general, las personas reinventan este problema y las malas soluciones una y otra vez. ¿Es este un espacio? "" y qué pasa con "\ n", "\ t" o algún carácter de espacio en blanco Unicode que nunca has visto, en gran parte porque es invisible. Si bien puedes salirte con la tuya
Una solución débil
Si alguna vez necesita sacudirse la realidad, vea un video de WWDC sobre cadenas o fechas. En resumen, casi siempre es mejor permitir que Apple resuelva este tipo de tarea mundana.
Solución robusta: use NSCharacterSet
La manera de hacer esto correctamente, en mi humilde opinión, es usar,
NSCharacterSet
ya que, como se dijo anteriormente, su espacio en blanco podría no ser lo que esperaba y Apple ha proporcionado un conjunto de caracteres de espacio en blanco. Para explorar los diversos conjuntos de caracteres proporcionados, consulte la documentación del desarrollador NSCharacterSet de Apple y luego, solo entonces, aumente o construya un nuevo conjunto de caracteres si no se ajusta a sus necesidades.NSCharacterSet espacios en blanco
fuente
En Swift 4.2 y Xcode 10
Opción 1
opcion 2
Opción 3
Opcion 4
Por la documentación de Apple ...
fuente
Swift 4 hace que sea mucho más fácil dividir caracteres, solo use la nueva función de división para cadenas.
Ejemplo:
let s = "hi, hello" let a = s.split(separator: ",") print(a)
Ahora tienes una matriz con 'hola' y 'hola'.
fuente
Actualización para Swift 5 y la forma más sencilla
Esto imprime,
Sin embargo, si desea filtrar una cadena vacía,
Salida,
Pero asegúrate, la Fundación es importada
fuente
Swift 3
AAA
,BBB
yCCC
.whitespaces
con.whitespacesAndNewlines
fuente
Swift 4, Xcode 10 y iOS 12 Update 100% funcionando
Consulte la documentación de Apple aquí para obtener más información.
fuente
Xcode 8.0 / Swift 3
Largo camino:
fuente
Tuve un escenario en el que varios caracteres de control pueden estar presentes en la cadena que quiero dividir. En lugar de mantener una serie de estos, solo dejo que Apple maneje esa parte.
Lo siguiente funciona con Swift 3.0.1 en iOS 10:
fuente
Encontré un caso interesante, que
Método 1
Cuando utilicé este comando para dividir algún símbolo de los datos que se cargaron desde el servidor , se puede dividir durante la prueba en el simulador y sincronizarse con el dispositivo de prueba, pero no se dividirá en la aplicación de publicación y Ad Hoc
Me llevó mucho tiempo rastrear este error, podría maldecir de alguna versión Swift, o alguna versión de iOS o ninguno
No se trata también del código HTML, ya que trato de stringByRemovingPercentEncoding y todavía no funciona
Además 10/10/2015
en Swift 2.0, este método se ha cambiado a
método 2
Cuando utilicé este comando, puede dividir los mismos datos que se cargan correctamente desde el servidor
Conclusión, realmente sugiero usar el método 2
fuente
La mayoría de estas respuestas asumen que la entrada contiene un espacio, no un espacio en blanco , y un solo espacio en eso. Si puede hacer esa suposición con seguridad, entonces la respuesta aceptada (de bennett) es bastante elegante y también el método con el que iré cuando pueda.
Cuando no podemos hacer esa suposición, una solución más sólida necesita cubrir las siguientes situaciones que la mayoría de las respuestas aquí no consideran:
\n
) y Windows (\r\n
)Para cubrir estos casos, esta solución utiliza expresiones regulares para convertir todos los espacios en blanco (incluidos los caracteres recurrentes y de nueva línea de Windows) en un solo espacio, recorta y luego divide en un solo espacio:
Swift 3:
fuente
O sin cierres, puedes hacer esto en Swift 2:
fuente
Pasos para dividir una cadena en una matriz en Swift 4.
Nota: variableName.components (separados por: "palabra clave dividida")
fuente
Swift 4
Salida
fuente
Digamos que tiene una variable llamada "Hello World" y si desea dividirla y almacenarla en dos variables diferentes, puede usarla así:
fuente
Xcode 7.2 (7C68)
fuente
Swift 2.2 Error Handling & capitalizedString Added:
fuente
El manejo de cadenas sigue siendo un desafío en Swift y sigue cambiando significativamente, como puede ver en otras respuestas. Esperemos que las cosas se calmen y se vuelva más simple. Esta es la forma de hacerlo con la versión 3.0 actual de Swift con múltiples caracteres separadores.
Swift 3:
fuente
Estaba buscando una división floja , como PHP
explode
donde se incluyen secuencias vacías en la matriz resultante, esto funcionó para mí:Salida:
fuente
Esto proporciona una variedad de partes divididas directamente
entonces puedes usar así,
fuente
Solo el
split
es la respuesta correcta, aquí están las diferencias para más de 2 espacios.fuente
Esto ha cambiado nuevamente en Beta 5. ¡Weee! Ahora es un método en CollectionType
Antiguo:
Nuevo:
Notas de lanzamiento de manzanas
fuente
Para swift 2, XCode 7.1:
fuente
Aquí hay un algoritmo que acabo de construir, que dividirá uno
String
por cualquieraCharacter
de la matriz y, si hay algún deseo de mantener las subcadenas con caracteres divididos, se podría establecer elswallow
parámetrotrue
.Xcode 7.3 - Swift 2.2:
Ejemplo:
fuente