Digamos que eu tenha uma string aqui:
var fullName: String = "First Last"
Eu quero dividir a base da string em 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.
fullName.utf8.split( <utf-8 character code> )
funciona tão bem (substitua.utf8
com.utf16
a UTF-16). Por exemplo, a divisão+
poderia ser feita usandofullName.utf8.split(43)
Respostas:
A maneira Swift é usar a
split
função global , assim:com Swift 2
No Swift 2, o uso da divisão se torna um pouco mais complicado devido à introdução do tipo interno CharacterView. Isso significa que String não adota mais os protocolos SequenceType ou CollectionType e você deve usar a
.characters
propriedade para acessar uma representação do tipo CharacterView de uma instância de String. (Nota: o CharacterView adota os protocolos SequenceType e CollectionType).fonte
split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false)
.componentsSeparatedByString()
método antigo se o seu separador tiver mais do que um único caractere. E por mais legal que sejalet (firstName, lastName) = split(fullName) {$0 == ' '}
, isso não funciona, infelizmente.split("a,b;c,d") {$0 == "," || $0 == ";"}
ousplit("a,b;c,d") {contains(",;", $0)}
Basta chamar o
componentsSeparatedByString
método no seufullName
Atualização para Swift 3+
fonte
NSString
(o Swift os troca automaticamente ao importarFoundation
).[String]
) no Xcode 7.2.O método mais fácil de fazer isso é usar componentsSeparatedBy:
Para Swift 2:
Para Swift 3:
fonte
.componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
componentsSeparatedByString
ecomponentsSeparatedByCharactersInSet
Swift Dev. 4.0 (24 de maio de 2017)
Uma nova função
split
no Swift 4 ( Beta ).Resultado:
Acessando valores:
Xcode 8.1 / Swift 3.0.1
Aqui está o caminho de vários delimitadores com array.
Resultado:
fonte
import Foundation
à classe em que você está usando isso. #SavedYouFiveMinuteslet a="a,,b,c"
e usa,a.split(separator: ",")
obtém uma matriz como["a", "b", c"]
por padrão. Isso pode ser alterado usando oomittingEmptySubsequences: false
que é verdadeiro por padrão.Swift 4 ou posterior
Se você apenas precisar formatar corretamente o nome de uma pessoa, poderá usar PersonNameComponentsFormatter .
editar / atualizar:
Swift 5 ou posterior
Para apenas dividir uma string por caracteres que não sejam da letra, podemos usar a nova propriedade Character
isLetter
:fonte
fullName.split { $0.isWhitespace }.map(String.init)
let words = line.split{ $0.isWhitespace }.map{ String($0)}
Obrigado @LeoDabus pela sua versão (meu comentário original tinha código ausente). Também sugiro mover a versão Swift 5 para o topo da resposta.Como alternativa à resposta do WMios, você também pode usar
componentsSeparatedByCharactersInSet
, o que pode ser útil no caso de haver mais separadores (espaço em branco, vírgula etc.).Com sua entrada específica:
Usando vários separadores:
fonte
,
ou;
ou qualquer outro separadorSwift 4
fonte
A questão do espaço em branco
Geralmente, as pessoas reinventam esse problema e soluções ruins repetidamente. Isso é um espaço? "" e quanto a "\ 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
Se você precisar controlar a realidade, assista a um vídeo da WWDC sobre sequências ou datas. Em resumo, é 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
pois, como declarado anteriormente, seu espaço em branco pode não ser o que você espera e a Apple forneceu um conjunto de caracteres para espaço em branco. Para explorar os vários conjuntos de caracteres fornecidos, consulte 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.NSCharacterSet espaços em branco
fonte
No Swift 4.2 e no Xcode 10
Opção 1
opção 2
Opção 3
Opção 4
Por documentação da Apple ....
fonte
O Swift 4 facilita muito a divisão de caracteres, basta usar 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 'oi'.
fonte
Atualização para o Swift 5 e a maneira mais simples
Isso imprime,
No entanto, se você deseja filtrar a string vazia,
Resultado,
Mas verifique se o Foundation é importado
fonte
Swift 3
AAA
,BBB
eCCC
.whitespaces
por.whitespacesAndNewlines
fonte
Swift 4, Xcode 10 e iOS 12 atualizam 100% de funcionamento
Consulte a documentação da Apple aqui para obter mais informações.
fonte
Xcode 8.0 / Swift 3
Longo caminho:
fonte
Eu tive um cenário em que vários caracteres de controle podem estar presentes na string que eu quero dividir. Em vez de manter uma variedade dessas, apenas deixei a Apple lidar com essa parte.
O seguinte funciona com o Swift 3.0.1 no iOS 10:
fonte
Encontrei um caso interessante, que
Método 1
Quando usei esse comando para dividir algum símbolo dos dados carregados do servidor , ele pode ser dividido durante o teste no simulador e sincronizado com o dispositivo de teste, mas não será dividido no aplicativo de publicação e no Ad Hoc
Levo muito tempo para rastrear esse erro, ele pode ser amaldiçoado por alguma versão Swift ou por uma versão iOS ou por nenhuma
Também não é sobre o código HTML, já que tento stringByRemovingPercentEncoding e ainda não está funcionando
adição 10/10/2015
no Swift 2.0, esse método foi alterado para
método 2
Quando usei esse comando, ele pode dividir os mesmos dados carregados do servidor corretamente
Conclusão, eu realmente sugiro usar o método 2
fonte
A maioria dessas respostas pressupõe que a entrada contenha um espaço - não um espaço em branco e um único espaço nele. Se você pode fazer essa suposição com segurança, a resposta aceita (do bennett) é bastante elegante e também o método que seguirei quando puder.
Quando não podemos fazer essa suposição, uma solução mais robusta precisa cobrir as seguintes descrições que a maioria das respostas aqui não considera:
\n
) e Windows (\r\n
)Para cobrir esses casos, esta solução usa o regex para converter todos os espaços em branco (incluindo caracteres recorrentes e de nova linha do Windows) em um único espaço, apara e divide por um único espaço:
Swift 3:
fonte
Ou sem fechamentos, você pode fazer exatamente isso no Swift 2:
fonte
Etapas para dividir uma string em uma matriz no Swift 4.
Nota: variableName.components (selectedBy: "split keyword")
fonte
Swift 4
Resultado
fonte
Digamos que você tenha uma variável chamada "Hello World" e, se quiser dividi-la e armazená-la em duas variáveis diferentes, poderá usar o seguinte:
fonte
Xcode 7.2 (7C68)
fonte
Manipulação de erro do Swift 2.2 & capitalizedString Adicionado:
fonte
O manuseio 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 fiquem mais simples. Essa é a maneira de fazer isso com a versão 3.0 atual do Swift, com vários caracteres separadores.
Swift 3:
fonte
Eu estava procurando por uma divisão frouxa , como PHP,
explode
onde sequências vazias são incluídas na matriz resultante, isso funcionou para mim:Resultado:
fonte
Isso fornece uma variedade de partes separadas diretamente
então você pode usar assim,
fonte
Somente a
split
resposta é correta, eis a diferença para mais de 2 espaços.fonte
Isso mudou novamente no Beta 5. Weee! Agora é um método no CollectionType
Velho:
Novo:
Notas de versão de maçãs
fonte
Para o Swift 2, o XCode 7.1:
fonte
Aqui está um algoritmo que acabei de construir, que dividirá um
String
por qualquerCharacter
da matriz e, se houver algum desejo de manter as substrings com caracteres divididos, pode-se definir oswallow
parâmetrotrue
.Xcode 7.3 - Swift 2.2:
Exemplo:
fonte