Eu tive que migrar muito código manualmente por causa do Swift 3. Por isso, decidi criar extensões. Portanto, agora, se for necessário atualizar para uma nova versão principal, preciso migrar apenas a extensão. Aqui você encontra algumas extensões do Swift 3 que eu criei. github.com/tukur187/Swift3
Shkelzen
Respostas:
1284
A partir do Swift 4+
É apenas:
test1.count
por razões.
(Obrigado a Martin R)
A partir do Swift 2:
Com o Swift 2, a Apple mudou as funções globais para extensões de protocolo, extensões que correspondem a qualquer tipo em conformidade com um protocolo. Portanto, a nova sintaxe é:
test1.characters.count
(Obrigado a JohnDifool pelo aviso)
A partir do Swift 1
Use o método de contagem de caracteres:
let unusualMenagerie ="Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")// prints "unusualMenagerie has 40 characters"
direto do Guia Apple Swift
(observe, para versões do Swift anteriores à 1.2, isso seria o caso countElements(unusualMenagerie))
para sua variável, seria
length = count(test1)// was countElements in earlier versions of Swift
Interessante que countElements é uma função global. Existe uma lista de funções globais?
Scott Walter
7
O problema com countElements é que ele é declarado assim: func countElements <T> (x: T) -> T.IndexType.DistanceType e o tipo de retorno não aceita a operação +.
MarkAurelius
288
Era muito difícil adicionar um método str.length. (levanta o punho com raiva)
botbot
13
Com Swift 2, só posso chegar a este trabalho: deixar len = test1.characters.count
Laurent
7
Observe que com o Swift 4, será string.count.
Martin R
335
TLDR:
Para Swift 2.0 e 3.0, use test1.characters.count. Mas, há algumas coisas que você deve saber. Então, continue a ler.
Contando caracteres no Swift
Antes do Swift 2.0, countera uma função global. A partir do Swift 2.0, ele pode ser chamado como uma função de membro.
test1.characters.count
Ele retornará o número real de caracteres Unicode em a String, portanto, é a alternativa mais correta no sentido de que, se você imprimir a string e contar caracteres à mão, obterá o mesmo resultado.
No entanto, devido à maneira como Stringssão implementadas no Swift, os caracteres nem sempre ocupam a mesma quantidade de memória; portanto, lembre-se de que isso se comporta de maneira bem diferente dos métodos comuns de contagem de caracteres em outros idiomas.
Por exemplo, você também pode usar test1.utf16.count
Mas, como observado abaixo, o valor retornado não é garantido para ser o mesmo que o de chamar counton characters.
A partir da referência do idioma:
Clusters de grafema estendidos podem ser compostos de um ou mais escalares Unicode. Isso significa que caracteres diferentes - e diferentes representações do mesmo caractere - podem exigir quantidades diferentes de memória para serem armazenadas. Por esse motivo, os caracteres no Swift não ocupam a mesma quantidade de memória na representação de uma string. Como resultado, o número de caracteres em uma sequência não pode ser calculado sem percorrer a sequência para determinar seus limites estendidos do cluster grafema. Se você estiver trabalhando com valores de cadeia particularmente longos, lembre-se de que a propriedade de caracteres deve iterar sobre os escalares Unicode em toda a cadeia, a fim de determinar os caracteres dessa cadeia.
A contagem dos caracteres retornados pela propriedade caracteres nem sempre é igual à propriedade length de um NSString que contém os mesmos caracteres. O comprimento de um NSString é baseado no número de unidades de código de 16 bits na representação UTF-16 da string e não no número de clusters de grafema estendidos Unicode na string.
Um exemplo que ilustra perfeitamente a situação descrita acima é o de verificar o comprimento de uma sequência que contém um único caractere emoji, conforme apontado por n00neimp0rtant nos comentários.
var emoji ="👍"
emoji.characters.count //returns 1emoji.utf16.count //returns 2
Agradeço sua resposta detalhada e cautelosa, mas devo admitir que me deixou desconfortável. Você me deu três maneiras de obter o comprimento de uma string, todas com a isenção de responsabilidade de que as respostas que elas dão podem não ser o que você espera. Não existe realmente nenhuma maneira confiável incorporada ao Swift para obter um valor preciso e confiável do comprimento de uma string?
n00neimp0rtant
6
@ n00neimp0rtant. Desculpe se eu não deixei claro. A primeira solução ( countElements()) obtém o número exato de caracteres na String. Pode ser diferente do que você obteria ao chamar [str length]Objective-C, porque o lengthmétodo assume que todos os caracteres da sequência são compostos por unidades de código de 16 bits, enquanto countElements()obtém o número real de caracteres Unicode. No entanto, na maioria das vezes, todas as alternativas acima retornam os mesmos resultados, especialmente se você estiver trabalhando com caracteres comuns no idioma inglês.
Cezar
2
@ n00neimp0rtant Alterei um pouco minha resposta para tentar torná-la mais clara.
Cezar
2
Entendo o que você quer dizer agora. Eu apenas tentei obter o comprimento de uma string contendo um único caractere Emoji; O objetivo-C me deu um valor de 4, e Swift me deu um valor de 1. Portanto, parece realmente mais preciso (e, portanto, ironicamente "não é o que eu esperaria" = P). Obrigado pelo esclarecimento!
n00neimp0rtant
1
@ n00neimp0rtant Exatamente! Esse é um exemplo perfeito. Eu mesmo vou adicioná-lo à resposta
Cezar
92
Atualização Swift 1.2: não há mais countElements para contar o tamanho das coleções. Basta usar a função count como um substituto: count ("Swift")
Retorna String.CharacterView.IndexDistance. E o Int?
eonist
@GitSync onde? Eu não te entendo #
21917 Vyacheslav
@Vyacheslav em rápida 4 "string" retornos .Count String.CharacterView.IndexDistance Veja minha resposta aqui: stackoverflow.com/a/47203597/5389500 para obter int em Swift 3 e 4
eonist
Eu testei este é o parque infantil:
Vyacheslav
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground" print(type(of: str.characters.count)) print(type(of: str.count))
Vyacheslav
25
Se você está apenas tentando ver se uma string está vazia ou não (verificando se o comprimento é 0), o Swift oferece um método de teste booleano simples em String
myString.isEmpty
O outro lado dessa moeda eram pessoas perguntando no ObjectiveC como perguntar se uma string estava vazia, onde a resposta era verificar se o comprimento era 0:
tl; dr Se você deseja o comprimento de um tipo String em termos do número de caracteres legíveis por humanos, use countElements () . Se você quiser saber o tamanho em termos do número de clusters de grafema estendidos , use endIndex . Continue lendo para obter detalhes.
O tipo String é implementado como uma coleção ordenada (ou seja, sequência) de caracteres Unicode e está em conformidade com o protocolo CollectionType , que está em conformidade com o protocolo _CollectionType , que é o tipo de entrada esperado por countElements () . Portanto, countElements () pode ser chamado, passando um tipo String e retornará a contagem de caracteres.
No entanto, em conformidade com CollectionType , que por sua vez está em conformidade com _CollectionType , Cordas também implementa as startIndex e endIndex propriedades computadas, o que realmente representam a posição do índice antes de o primeiro conjunto de caracteres, ea posição do índice após o último cluster caráter, respectivamente . Portanto, na cadeia "ABC", a posição do índice antes de A é 0 e depois de C é 3. Portanto, endIndex = 3, que também é o comprimento da cadeia.
Então, endIndex pode ser usado para obter o comprimento de qualquer tipo de String, certo?
Bem, nem sempre ... Os caracteres Unicode são, na verdade , conjuntos de grafemas estendidos , que são sequências de um ou mais escalares Unicode combinados para criar um único caractere legível por humanos.
let circledStar:Character="\u{2606}\u{20DD}"// ☆⃝
circledStar é um caractere único composto por U + 2606 (uma estrela branca) e U + 20DD (um círculo anexo). Vamos criar uma String a partir de circledStar e comparar os resultados de countElements () e endIndex .
let circledStarString ="\(circledStar)"
countElements(circledStarString)// 1
circledStarString.endIndex //2
Veja a resposta de Cezar. Isso não fornecerá necessariamente o número de "caracteres" na string, para a definição de "caractere" da maioria das pessoas. Por outro lado, nem o Objective-C - cabe a você decidir se você se importa ou não.
jbg
12
Swift 5.1, 5
let flag ="🇵🇷"
print(flag.count)// Prints "1" -- Counts the characters and emoji as length 1
print(flag.unicodeScalars.count)// Prints "2" -- Counts the unicode lenght ex. "A" is 65
print(flag.utf16.count)// Prints "4"
print(flag.utf8.count)//Prints"8"
Parece a mesma velocidade que .utf16count, muito mais rápido do que a contagem (string)
samir105
8
Para o Xcode 7.3 e Swift 2.2.
let str ="🐶"
Se você deseja o número de caracteres visuais:
str.characters.count
Se você deseja "as unidades de código de 16 bits na representação UTF-16 da string":
str.utf16.count
Na maioria das vezes, 1 é o que você precisa.
Quando você precisaria de 2 ? Encontrei um caso de uso para 2 :
let regex =try!NSRegularExpression(pattern:"🐶",
options:NSRegularExpressionOptions.UseUnixLineSeparators)let str ="🐶🐶🐶🐶🐶🐶"let result = regex.stringByReplacingMatchesInString(str,
options:NSMatchingOptions.WithTransparentBounds,
range:NSMakeRange(0, str.utf16.count), withTemplate:"dog")
print(result)// dogdogdogdogdogdog
Se você usar 1 , o resultado está incorreto:
let result = regex.stringByReplacingMatchesInString(str,
options:NSMatchingOptions.WithTransparentBounds,
range:NSMakeRange(0, str.characters.count), withTemplate:"dog")
print(result)// dogdogdog🐶🐶🐶
No swift4 eu sempre usei string.countaté hoje, descobri que
string.endIndex.encodedOffset
é a melhor substituição porque é mais rápida - para 50 000 caracteres, a sequência é cerca de 6 vezes mais rápida que .count. O .countdepende do comprimento da corda, mas .endIndex.encodedOffsetnão o faz.
Mas existe um NÃO. Não é bom para seqüências de caracteres com emojis, ele dará resultado errado, portanto, apenas .countestá correto.
Por que você gostaria de usar utf8.count? Isso não dá a contagem de caracteres. Ele fornece o número de bytes necessários para a codificação UTF-8 da sequência.
Eu acho que você está tentando fazer mais do que apenas obter o comprimento da string e, de qualquer forma, isso parece incompleto (não deveria haver um return truecaso também?). Você pode verificar e, no caso, editar sua resposta? Obrigado!
Fabio diz Reinstate Monica
2
Atualização do Swift 4 em comparação com o Swift 3
O Swift 4 remove a necessidade de uma matriz de caracteres na String. Isso significa que você pode chamar diretamente countuma sequência sem obter primeiro a matriz de caracteres.
"hello".count //5
Enquanto no swift 3, você precisará obter uma matriz de caracteres e depois contar o elemento nessa matriz. Observe que este método a seguir ainda está disponível no swift 4.0, pois você ainda pode chamar characterspara acessar a matriz de caracteres da sequência especificada
"hello".characters.count //5
O Swift 4.0 também adota o Unicode 9 e agora pode interpretar clusters de grafema. Por exemplo, contar com um emoji lhe dará 1 enquanto no swift 3.0, você pode obter contagens maiores que 1.
"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨❤️💋👨".count //Swift4.0 prints 1,Swift3.0 prints 4
Você pode obter o comprimento simplesmente escrevendo uma extensão:
extensionString{// MARK: Use if it's Swift 2
func stringLength(str:String)->Int{return str.characters.count
}// MARK: Use if it's Swift 3
func stringLength(_ str:String)->Int{return str.characters.count
}// MARK: Use if it's Swift 4
func stringLength(_ str:String)->Int{return str.count
}}
A Apple tornou diferente de outro idioma importante. A maneira atual é chamar:
test1.characters.count
No entanto, para ter cuidado, quando você diz comprimento, significa a contagem de caracteres e não a contagem de bytes, porque esses dois podem ser diferentes quando você usa caracteres não-ascii.
Por exemplo;
"你好啊hi".characters.countlhe dará 5, mas essa não é a contagem de bytes. Para obter a contagem real de bytes, você precisa "你好啊hi".lengthOfBytes(using: String.Encoding.utf8). Isso lhe dará 11.
Respostas:
A partir do Swift 4+
É apenas:
por razões.
(Obrigado a Martin R)
A partir do Swift 2:
Com o Swift 2, a Apple mudou as funções globais para extensões de protocolo, extensões que correspondem a qualquer tipo em conformidade com um protocolo. Portanto, a nova sintaxe é:
(Obrigado a JohnDifool pelo aviso)
A partir do Swift 1
Use o método de contagem de caracteres:
direto do Guia Apple Swift
(observe, para versões do Swift anteriores à 1.2, isso seria o caso
countElements(unusualMenagerie)
)para sua variável, seria
Ou você pode usar test1.utf16count
fonte
string.count
.TLDR:
Para Swift 2.0 e 3.0, use
test1.characters.count
. Mas, há algumas coisas que você deve saber. Então, continue a ler.Contando caracteres no Swift
Antes do Swift 2.0,
count
era uma função global. A partir do Swift 2.0, ele pode ser chamado como uma função de membro.Ele retornará o número real de caracteres Unicode em a
String
, portanto, é a alternativa mais correta no sentido de que, se você imprimir a string e contar caracteres à mão, obterá o mesmo resultado.No entanto, devido à maneira como
Strings
são implementadas no Swift, os caracteres nem sempre ocupam a mesma quantidade de memória; portanto, lembre-se de que isso se comporta de maneira bem diferente dos métodos comuns de contagem de caracteres em outros idiomas.Por exemplo, você também pode usar
test1.utf16.count
Mas, como observado abaixo, o valor retornado não é garantido para ser o mesmo que o de chamar
count
oncharacters
.A partir da referência do idioma:
Um exemplo que ilustra perfeitamente a situação descrita acima é o de verificar o comprimento de uma sequência que contém um único caractere emoji, conforme apontado por n00neimp0rtant nos comentários.
fonte
countElements()
) obtém o número exato de caracteres na String. Pode ser diferente do que você obteria ao chamar[str length]
Objective-C, porque olength
método assume que todos os caracteres da sequência são compostos por unidades de código de 16 bits, enquantocountElements()
obtém o número real de caracteres Unicode. No entanto, na maioria das vezes, todas as alternativas acima retornam os mesmos resultados, especialmente se você estiver trabalhando com caracteres comuns no idioma inglês.Atualização Swift 1.2: não há mais countElements para contar o tamanho das coleções. Basta usar a função count como um substituto: count ("Swift")Swift 2.0, 3.0 e 3.1:Swift 4.2 (4.0 em diante): [Apple Documentation - Strings]
fonte
Swift 1.1
Swift 1.2
Swift 2.0
Swift 4.2
fonte
Swift 4
"string".count
;)
Swift 3
uso
"string".length
fonte
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground" print(type(of: str.characters.count)) print(type(of: str.count))
Se você está apenas tentando ver se uma string está vazia ou não (verificando se o comprimento é 0), o Swift oferece um método de teste booleano simples em
String
O outro lado dessa moeda eram pessoas perguntando no ObjectiveC como perguntar se uma string estava vazia, onde a resposta era verificar se o comprimento era 0:
NSString está vazio
fonte
tl; dr Se você deseja o comprimento de um tipo String em termos do número de caracteres legíveis por humanos, use countElements () . Se você quiser saber o tamanho em termos do número de clusters de grafema estendidos , use endIndex . Continue lendo para obter detalhes.
O tipo String é implementado como uma coleção ordenada (ou seja, sequência) de caracteres Unicode e está em conformidade com o protocolo CollectionType , que está em conformidade com o protocolo _CollectionType , que é o tipo de entrada esperado por countElements () . Portanto, countElements () pode ser chamado, passando um tipo String e retornará a contagem de caracteres.
No entanto, em conformidade com CollectionType , que por sua vez está em conformidade com _CollectionType , Cordas também implementa as startIndex e endIndex propriedades computadas, o que realmente representam a posição do índice antes de o primeiro conjunto de caracteres, ea posição do índice após o último cluster caráter, respectivamente . Portanto, na cadeia "ABC", a posição do índice antes de A é 0 e depois de C é 3. Portanto, endIndex = 3, que também é o comprimento da cadeia.
Então, endIndex pode ser usado para obter o comprimento de qualquer tipo de String, certo?
Bem, nem sempre ... Os caracteres Unicode são, na verdade , conjuntos de grafemas estendidos , que são sequências de um ou mais escalares Unicode combinados para criar um único caractere legível por humanos.
circledStar é um caractere único composto por U + 2606 (uma estrela branca) e U + 20DD (um círculo anexo). Vamos criar uma String a partir de circledStar e comparar os resultados de countElements () e endIndex .
fonte
No Swift 2.0
count
não funciona mais. Você pode usar isso:fonte
Aqui está algo mais curto e mais natural do que usar uma função global:
Não sei se está disponível na versão beta 1. Mas está definitivamente lá na versão beta 2.
fonte
Swift 5.1, 5
fonte
Atualizado para o Xcode 6 beta 4, altere o método utf16count -> utf16Count
Ou
fonte
utf16count
será erradoA partir do Swift 1.2
utf16Count
foi removida. Agora você deve usar acount()
função global e passar a visualização UTF16 da string. Exemplo abaixo ...fonte
Para o Xcode 7.3 e Swift 2.2.
Se você deseja o número de caracteres visuais:
Se você deseja "as unidades de código de 16 bits na representação UTF-16 da string":
Na maioria das vezes, 1 é o que você precisa.
Quando você precisaria de 2 ? Encontrei um caso de uso para 2 :
Se você usar 1 , o resultado está incorreto:
fonte
Você poderia tentar assim
fonte
test1.utf16count
no Swift 2.x, a seguir, é como encontrar o comprimento de uma string
retorna 24
fonte
Swift 2.0: obtenha uma contagem:
yourString.text.characters.count
Um exemplo divertido de como isso é útil seria mostrar uma contagem regressiva de caracteres de algum número (150 por exemplo) em um UITextView:
fonte
No swift4 eu sempre usei
string.count
até hoje, descobri queé a melhor substituição porque é mais rápida - para 50 000 caracteres, a sequência é cerca de 6 vezes mais rápida que
.count
. O.count
depende do comprimento da corda, mas.endIndex.encodedOffset
não o faz.Mas existe um NÃO. Não é bom para seqüências de caracteres com emojis, ele dará resultado errado, portanto, apenas
.count
está correto.fonte
No Swift 4 : se a sequência não contiver caracteres unicode, use o seguinte
Se a sequência contiver caracteres unicode, use o seguinte:
fonte
utf8.count
? Isso não dá a contagem de caracteres. Ele fornece o número de bytes necessários para a codificação UTF-8 da sequência.No Xcode 6.1.1
Eu acho que os brainiacs vão mudar isso em todas as versões menores.
fonte
Obtenha o valor da sequência de caracteres na sua visualização de texto ou campo de texto:
Encontre a contagem dos caracteres na string:
fonte
Aqui está o que eu acabei fazendo
fonte
return true
caso também?). Você pode verificar e, no caso, editar sua resposta? Obrigado!Atualização do Swift 4 em comparação com o Swift 3
O Swift 4 remove a necessidade de uma matriz de caracteres na String. Isso significa que você pode chamar diretamente
count
uma sequência sem obter primeiro a matriz de caracteres.Enquanto no swift 3, você precisará obter uma matriz de caracteres e depois contar o elemento nessa matriz. Observe que este método a seguir ainda está disponível no swift 4.0, pois você ainda pode chamar
characters
para acessar a matriz de caracteres da sequência especificadaO Swift 4.0 também adota o Unicode 9 e agora pode interpretar clusters de grafema. Por exemplo, contar com um emoji lhe dará 1 enquanto no swift 3.0, você pode obter contagens maiores que 1.
fonte
Swift 4
Lembre-se: o espaço também é contado no número
fonte
Você pode obter o comprimento simplesmente escrevendo uma extensão:
fonte
Isso conta os caracteres em Regular Swift String
Isso conta os caracteres em um NSString
fonte
A melhor maneira de contar String em Swift é esta:
fonte
String e NSString são pontes gratuitas para que você possa usar todos os métodos disponíveis para o NSString com String rápida
fonte
você receberá o número de letras / números etc em sua string.
ex:
( imprime " 13 ")
fonte
A Apple tornou diferente de outro idioma importante. A maneira atual é chamar:
test1.characters.count
No entanto, para ter cuidado, quando você diz comprimento, significa a contagem de caracteres e não a contagem de bytes, porque esses dois podem ser diferentes quando você usa caracteres não-ascii.
Por exemplo;
"你好啊hi".characters.count
lhe dará 5, mas essa não é a contagem de bytes. Para obter a contagem real de bytes, você precisa"你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. Isso lhe dará 11.fonte
Agora (no Swift 2.3) se você usar:
o método retornará um tipo "Distância", se você precisar retornar um número inteiro, digite cast da seguinte forma:
fonte
Distance
deString.CharacterView
éInt
, não deve haver necessidade para este elenco.