[Ios] Swift: divide una cadena en una matriz


Answers

Simplemente llame al método componentsSeparatedByString 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]
Question

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.




Espero que esto sea útil

Swift 4: divide una cadena en una matriz. Paso 1: asignar cadena. paso 2: basado en @ spliting. Nota: variableName.components (separatedBy: "palabra clave dividida")

let fullName: String = "First Last @ triggerd event of the session by session storage @ it can be divided by the event of the trigger."
let fullNameArr = fullName.components(separatedBy: "@")
print("split", fullNameArr)



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



El manejo de cadenas sigue siendo un desafío en Swift y sigue cambiando de manera significativa, como se puede ver en otras respuestas. Afortunadamente las cosas se calman y se vuelve más simple. Esta es la manera de hacerlo con la versión 3.0 actual de Swift con múltiples caracteres separadores.

Swift 3:

let chars = CharacterSet(charactersIn: ".,; -")
let split = phrase.components(separatedBy: chars)

// Or if the enums do what you want, these are preferred. 
let chars2 = CharacterSet.alphaNumerics // .whitespaces, .punctuation, .capitalizedLetters etc
let split2 = phrase.components(separatedBy: chars2)



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"
s.split(separator: ",")

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




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"]



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 usar NSCharacterSet ya que, como se dijo anteriormente, su espacio en blanco podría no ser el que esperaba y Apple ha proporcionado un juego de caracteres en blanco. Para explorar los diversos conjuntos de caracteres proporcionados, consulte la documentación del desarrollador de NSCharacterSet de Apple 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 conjunto de caracteres que contiene los caracteres en la Categoría general Z de Unicode 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)



let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2 (7C68)




No encontré la solución que manejaría nombres con 3 o más componentes y admitir versiones anteriores de iOS.

struct NameComponentsSplitter {

    static func split(fullName: String) -> (String?, String?) {
        guard !fullName.isEmpty else {
            return (nil, nil)
        }
        let components = fullName.components(separatedBy: .whitespacesAndNewlines)
        let lastName = components.last
        let firstName = components.dropLast().joined(separator: " ")
        return (firstName.isEmpty ? nil : firstName, lastName)
    }
}

Pasó los casos de prueba:

func testThatItHandlesTwoComponents() {
    let (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Smith")
    XCTAssertEqual(firstName, "John")
    XCTAssertEqual(lastName, "Smith")
}

func testThatItHandlesMoreThanTwoComponents() {
    var (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Smith")
    XCTAssertEqual(firstName, "John Clark")
    XCTAssertEqual(lastName, "Smith")

    (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Jr. Smith")
    XCTAssertEqual(firstName, "John Clark Jr.")
    XCTAssertEqual(lastName, "Smith")
}

func testThatItHandlesEmptyInput() {
    let (firstName, lastName) = NameComponentsSplitter.split(fullName: "")
    XCTAssertEqual(firstName, nil)
    XCTAssertEqual(lastName, nil)
}



Swift 4

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



Según Swift 2.2

Simplemente escriba 2 líneas de código y obtendrá la cadena dividida.

let fullName = "FirstName LastName"
var splitedFullName = fullName.componentsSeparatedByString(" ")
print(splitedFullName[0])
print(splitedFullName[1]) 

Disfrutar. :)




Esto ha cambiado nuevamente en Beta 5. ¡Weee! Ahora es un método en CollectionType

Antiguo:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}

Nuevo:

var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}

Notas de lanzamiento de manzanas




O sin cierres puedes hacer esto en Swift 2:

let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])