ios - part - swift first character of string




Dividir uma String em uma matriz no Swift? (20)

A questão dos espaços em branco

Geralmente, as pessoas reinventam esse problema e soluções ruins repetidas vezes. Isso é um espaço? "" e sobre "\ n", "\ t" ou algum caractere de espaço em branco unicode que você nunca viu, em grande parte porque é invisível. Enquanto você pode se safar

Uma solução fraca

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

Se você precisar agitar sua realidade, assista a um vídeo da WWDC sobre strings ou datas. Em suma, é quase sempre melhor permitir que a Apple resolva esse tipo de tarefa mundana.

Solução robusta: use NSCharacterSet

A maneira de fazer isso corretamente, IMHO, é usar NSCharacterSet uma vez que, como dito anteriormente, seu espaço em branco pode não ser o esperado e a Apple forneceu um conjunto de caracteres em branco. Para explorar os vários conjuntos de caracteres fornecidos, verifique a documentação do desenvolvedor NSCharacterSet da Apple e, somente então, aumente ou construa um novo conjunto de caracteres se ele não atender às suas necessidades.

Espaços em branco de NSCharacterSet

Retorna um conjunto de caracteres contendo os caracteres em Unicode General Category Zs e CHARACTER TABULATION (U + 0009).

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

Digamos que eu tenha uma string aqui:

var fullName: String = "First Last"

Eu quero dividir a base de string no espaço em branco e atribuir os valores às suas respectivas variáveis

var fullNameArr = // something like: fullName.explode(" ") 

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

Além disso, às vezes, os usuários podem não ter um sobrenome.


A maioria dessas respostas pressupõe que a entrada contém um espaço - não espaço em branco e um único espaço para isso. Se você puder seguramente fazer essa suposição, então a resposta aceita (da bennett) é bastante elegante e também o método que eu usarei quando puder.

Quando não podemos fazer essa suposição, uma solução mais robusta precisa cobrir as seguintes afirmações que a maioria das respostas aqui não considera:

  • guias / novas linhas / espaços (espaço em branco), incluindo caracteres recorrentes
  • espaço em branco inicial / final
  • Caracteres de nova linha da Apple / Linux ( \n ) e Windows ( \r\n )

Para cobrir esses casos, essa solução usa regex para converter todo o espaço em branco (incluindo caracteres recorrentes e de nova linha do Windows) em um único espaço, corta e divide por um único espaço:

Swift 3:

let searchInput = "  First \r\n \n \t\t\tMiddle    Last "
let searchTerms = searchInput 
    .replacingOccurrences(
        of: "\\s+",
        with: " ",
        options: .regularExpression
    )
    .trimmingCharacters(in: .whitespaces)
    .components(separatedBy: " ")

// searchTerms == ["First", "Middle", "Last"]

A manipulação de cordas ainda é um desafio no Swift e continua mudando significativamente, como você pode ver em outras respostas. Espero que as coisas se acalmem e fique mais simples. Esta é a maneira de fazer isso com a versão 3.0 atual do Swift com vários 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)

Apenas chame o método componentsSeparatedByString no seu fullName

import Foundation

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

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

Atualização para o Swift 3+

import Foundation

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

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

Como alternativa à resposta do WMios, você também pode usar componentsSeparatedByCharactersInSet , o que pode ser útil caso você tenha mais separadores (espaço em branco, vírgula, etc.).

Com sua entrada específica:

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

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

Usando vários separadores:

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

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

Digamos que você tenha uma variável chamada "Hello World" e, se quiser dividi-la e armazená-la em duas variáveis ​​diferentes, você pode usar assim:

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last

Eu encontrei um caso interessante, que

Método 1

var data:[String] = split( featureData ) { $0 == "\u{003B}" }

Quando usei esse comando para dividir algum símbolo dos dados que foram carregados do servidor , ele pode ser dividido ao testar no simulador e sincronizar com o dispositivo de teste, mas não será dividido no app de publicação e no Ad Hoc

Levei muito tempo para rastrear esse erro, ele pode ser amaldiçoado por alguma versão do Swift, ou por alguma versão do iOS ou

Não é sobre o código HTML também, já que eu tento stringByRemovingPercentEncoding e ainda não funciona

além 10/10/2015

no Swift 2.0 este método foi alterado para

var data:[String] = featureData.split {$0 == "\u{003B}"}

método 2

var data:[String] = featureData.componentsSeparatedByString("\u{003B}")

Quando eu usei este comando, ele pode dividir os mesmos dados que são carregados do servidor corretamente

Conclusão, eu realmente sugiro usar o método 2

string.componentsSeparatedByString("")

Eu estava procurando uma divisão frouxa , como a explode do PHP, onde sequências vazias são incluídas na matriz resultante, isso funcionou para mim:

"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)

Saída:

["First", ""]

Eu tive um cenário onde vários caracteres de controle podem estar presentes na string que eu quero dividir. Em vez de manter um conjunto desses, deixei a Apple cuidar dessa parte.

O seguinte funciona com o Swift 3.0.1 no iOS 10:

let myArray = myString.components(separatedBy: .controlCharacters)

Isso mudou novamente no Beta 5. Weee! Agora é um método no CollectionType

Velho:

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

Novo:

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

Notas de lançamento de maçãs


O Swift 4 facilita muito a divisão de caracteres, apenas use a nova função de divisão para Strings.

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

Agora você tem uma matriz com 'oi' e 'olá'.


Ou sem encerramentos, você pode fazer exatamente isso no Swift 2:

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

O método mais fácil de fazer isso é usando componentsSeparatedBy:

Para o 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 o 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]

Conforme Swift 2.2

Você acabou de escrever o código de 2 linhas e você receberá a string dividida.

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

Apreciar. :)


Swift 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Retorna três strings AAA , BBB e CCC
  • Filtra campos vazios
  • Lida com vários espaços e caracteres de tabulação
  • Se você quiser lidar com novas linhas, substitua .whitespaces por .whitespacesAndNewlines

Swift 4, Xcode 10 e iOS 12 Update 100% funcionando

let fullName = "First Last"    
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullnameArr[1] //Last

Veja a documentação da Apple aqui para mais informações.


Swift 4

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

Swift Dev. 4,0 (24 de maio de 2017)

Uma nova função split no Swift 4 ( Beta ).

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

Saída:

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

Acessando valores:

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

Xcode 8.1 / Swift 3.0.1

Aqui está o caminho de vários delimitadores com array.

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

Saída:

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

Xcode 9 Swift 4 ou Xcode 8.2.1 • Swift 3.0.2

Se você só precisa formatar corretamente o nome de uma pessoa, você pode usar PersonNameComponentsFormatter .

A classe PersonNameComponentsFormatter fornece representações localizadas dos componentes do nome de uma pessoa, conforme representado por um objeto PersonNameComponents. Use essa classe para criar nomes localizados ao exibir informações do nome da pessoa para o usuário.

// 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.namePrefix   // Mr.
    nameComps.givenName    // Steven
    nameComps.middleName   // Paul
    nameComps.familyName   // Jobs
    nameComps.nameSuffix   // Jr.

    // It can also be configured 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."
}


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

Xcode 7.2 (7C68)







split