Pregunta Swift: divide una cadena en una matriz


Digamos que tengo una cadena aquí:

var fullName: String = "First Last"

Quiero dividir la base de cadena en espacios 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.


526
2017-09-05 03:51


origen


Respuestas:


La forma Swift es usar el split función, así:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil

con Swift 2 

En Swift 2, el uso de split se vuelve un poco más complicado debido a la introducción del tipo de CharacterView interno. Esto significa que String ya no adopta los protocolos SequenceType o CollectionType y en su lugar debe usar el .characters propiedad para acceder a una representación de tipo CharacterView de una instancia de String. (Nota: CharacterView adopta los protocolos SequenceType y CollectionType).

let fullName = "First Last"
let fullNameArr = fullName.characters.split{$0 == " "}.map(String.init)
// or simply:
// let fullNameArr = fullName.characters.split{" "}.map(String.init)

fullNameArr[0] // First
fullNameArr[1] // Last 

692
2017-10-09 05:06



Solo llama componentsSeparatedByString método en su fullName

import Foundation

var fullName: String = "First Last"
let fullNameArr = fullName.componentsSeparatedByString(" ")

var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]

Actualización para Swift 3+

import Foundation

let fullName    = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")

let name    = fullNameArr[0]
let surname = fullNameArr[1]

806
2017-09-05 04:12



El método más fácil de hacerlo es mediante el uso de componentsSeparatedBy:

Para Swift 2:

import Foundation
let fullName : String = "First Last";
let fullNameArr : [String] = fullName.componentsSeparatedByString(" ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]

Para Swift 3:

import Foundation

let fullName : String = "First Last"
let fullNameArr : [String] = fullName.components(separatedBy: " ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]

139
2017-09-05 04:09



Swift Dev. 4.0 (24 de mayo de 2017)

Una nueva función split en Swift 4 (Beta)

import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)

Salida:

["Hello", "Swift", "4", "2017"]

Acceso a valores:

print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017

Xcode 8.1 / Swift 3.0.1

Aquí está la forma de delimitadores múltiples con matriz.

import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)

Salida:

["12", "37", "2", "5"]

84
2017-11-21 18:12



Como alternativa a la respuesta de WMios, también puede usar componentsSeparatedByCharactersInSet, que puede ser útil en el caso de que tenga más separadores (espacio en blanco, coma, etc.).

Con su entrada específica:

let separators = NSCharacterSet(charactersInString: " ")
var fullName: String = "First Last";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["First", "Last"]

Usando separadores múltiples:

let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["Last", "First", "Middle"]

45
2017-09-05 06:42



Swift 4

let words = "these words will be elements in an array".components(separatedBy: " ")

41
2018-06-12 20:38



Xcode 9 Swift 4 o Xcode 8.2.1 • Swift 3.0.2

Si solo necesita formatear correctamente el nombre de una persona, puede usar PersonNameComponentsFormatter.

La clase PersonNameComponentsFormatter proporciona localizada   representaciones de los componentes del nombre de una persona, como se representa   por un objeto PersonNameComponents. Use esta clase para crear localizado   nombres cuando se muestra información de nombre de persona para el usuario.


// iOS (9.0 and later), macOS (10.11 and later), tvOS (9.0 and later), watchOS (2.0 and later)
let nameFormatter = PersonNameComponentsFormatter()

let name =  "Mr. Steven Paul Jobs Jr."
// personNameComponents requires iOS (10.0 and later)
if let nameComps  = nameFormatter.personNameComponents(from: name) {
    nameComps.givenName    // Steven
    nameComps.middleName   // Paul
    nameComps.familyName   // Jobs
    nameComps.nameSuffix   // Jr.
    nameComps.namePrefix   // Mr.

    // It can also be convufgured to format your names
    // Default (same as medium), short, long or abbreviated

    nameFormatter.style = .default
    nameFormatter.string(from: nameComps)   // "Steven Jobs"

    nameFormatter.style = .short
    nameFormatter.string(from: nameComps)   // "Steven"

    nameFormatter.style = .long
    nameFormatter.string(from: nameComps)   // "Mr. Steven Paul Jobs jr."

    nameFormatter.style = .abbreviated
    nameFormatter.string(from: nameComps)   // SJ

    // It can also be use to return an attributed string using annotatedString method
    nameFormatter.style = .long
    nameFormatter.annotatedString(from: nameComps)   // "Mr. Steven Paul Jobs jr."
}

enter image description here


33
2018-01-09 22:50



El problema del espacio en blanco

En general, las personas reinventan este problema y las malas soluciones una y otra vez. Es esto un espacio? "" y qué pasa con "\ n", "\ t" o algún carácter de espacio en blanco unicode que nunca hayas visto, en gran parte porque es invisible. Si bien puedes salirte con la tuya

Una solución débil

import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")

Si alguna vez necesita estrechar su control sobre la realidad, mire un video de la 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 forma de hacerlo correctamente, en mi humilde opinión, es utilizar NSCharacterSet dado que como se indicó anteriormente, su espacio en blanco podría no ser el que espera y Apple ha proporcionado un juego de caracteres en blanco. Para explorar los diversos conjuntos de caracteres proporcionados, echa un vistazo a Apple's Documentación del desarrollador de NSCharacterSet y luego, solo entonces, aumente o construya un nuevo juego de caracteres si no se ajusta a sus necesidades.

NSCharacterSet espacios en blanco

Devuelve un juego de caracteres que contiene los caracteres en Unicode General   Categoría Z y TABULACIÓN DE CARACTERES (U + 0009).

let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)

22
2018-01-01 20:34



Swift 4 hace que sea mucho más fácil dividir caracteres, solo usa la nueva función de división para Strings.

Ejemplo: let s = "hi, hello" let a = s.split(separator: ",") print(a)

Ahora tienes una matriz con 'hola' y 'hola'.


20
2018-06-07 17:21



Swift 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Devuelve tres cadenas AAA, BBB y CCC
  • Filtra los campos vacíos
  • Maneja múltiples espacios y caracteres de tabulación
  • Si desea manejar nuevas líneas, reemplace .whitespaces con .whitespacesAndNewlines

13
2017-09-16 19:36



Xcode 8.0 / Swift 3

let fullName = "First Last"
var fullNameArr = fullName.components(separatedBy: " ")

var firstname = fullNameArr[0] // First
var lastname = fullNameArr[1] // Last

Largo camino:

var fullName: String = "First Last"
fullName += " " // this will help to see the last word

var newElement = "" //Empty String
var fullNameArr = [String]() //Empty Array

for Character in fullName.characters {
    if Character == " " {
        fullNameArr.append(newElement)
        newElement = ""
    } else {
        newElement += "\(Character)"
    }
}


var firsName = fullNameArr[0] // First
var lastName = fullNameArr[1] // Last

12
2017-11-04 19:29