swift - empty - Obtener la longitud de una cadena
swift 4 string append (30)
¿Cómo se obtiene la longitud de una String
? Por ejemplo, tengo una variable definida como:
var test1: String = "Scott"
Sin embargo, parece que no puedo encontrar un método de longitud en la cadena.
TLDR:
Para Swift 2.0 y 3.0, use test1.characters.count
. Pero, hay algunas cosas que debes saber. Así que, sigue leyendo.
Contando personajes en Swift
Antes de Swift 2.0, el count
era una función global. A partir de Swift 2.0, se puede llamar como una función miembro.
test1.characters.count
Devolverá el número real de caracteres Unicode en una String
, por lo que es la alternativa más correcta en el sentido de que, si imprimiera la cadena y contara los caracteres a mano, obtendría el mismo resultado.
Sin embargo, debido a la forma en que se implementan las Strings
en Swift, los caracteres no siempre ocupan la misma cantidad de memoria, así que tenga en cuenta que esto se comporta de manera muy diferente a los métodos de conteo de caracteres habituales en otros idiomas.
Por ejemplo, también puede usar test1.utf16.count
Pero, como se indica a continuación, no se garantiza que el valor devuelto sea el mismo que el de count
con characters
.
De la referencia del idioma:
Los grupos de grafemas extendidos pueden estar compuestos por uno o más escalares Unicode. Esto significa que diferentes caracteres, y diferentes representaciones del mismo carácter, pueden requerir diferentes cantidades de memoria para almacenar. Debido a esto, los caracteres en Swift no ocupan la misma cantidad de memoria en la representación de una cadena. Como resultado, el número de caracteres en una cadena no se puede calcular sin iterar a través de la cadena para determinar sus límites de grupo de grafemas extendidos. Si está trabajando con valores de cadena particularmente largos, tenga en cuenta que la propiedad de los caracteres debe iterar sobre los escalares Unicode en toda la cadena para determinar los caracteres para esa cadena.
El recuento de los caracteres devueltos por la propiedad de caracteres no siempre es el mismo que la propiedad de longitud de una NSString que contiene los mismos caracteres. La longitud de una NSString se basa en el número de unidades de código de 16 bits dentro de la representación UTF-16 de la cadena y no en el número de agrupaciones de grafemas ampliados Unicode dentro de la cadena.
Un ejemplo que ilustra perfectamente la situación descrita anteriormente es la de verificar la longitud de una cadena que contiene un solo carácter emoji, como lo señala n00neimp0rtant en los comentarios.
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
Swift 4.2
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"
A partir de Swift 1.2 utf16Count
ha sido eliminado. Ahora debe usar la función global count()
y pasar la vista UTF16 de la cadena. Ejemplo abajo ...
let string = "Some string"
count(string.utf16)
Actualizado para Xcode 6 beta 4, cambie el método utf16count -> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
O
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
Ahora mismo (en Swift 2.3) si usas:
myString.characters.count
el método devolverá un tipo de "Distancia", si necesita el método para devolver un Integer, debe escribir cast como:
var count = myString.characters.count as Int
Apple lo hizo diferente de otro idioma importante. La forma actual es llamar a:
test1.characters.count
Sin embargo, para tener cuidado, cuando dices longitud, te refieres al número de caracteres, no al número de bytes, porque esos dos pueden ser diferentes cuando usas caracteres que no son ascii.
Por ejemplo; "你好啊hi".characters.count
te dará 5, pero este no es el recuento de los bytes. Para obtener el conteo real de bytes, debe hacer "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. Esto te dará 11.
Aquí hay algo más corto y más natural que usar una función global:
aString.utf16count
Aunque no sé si está disponible en beta 1. Pero definitivamente está ahí en la beta 2.
En Swift 4 : si la cadena no contiene caracteres Unicode, use lo siguiente
let str : String = "abcd"
let count = str.count // output 4
Si la cadena contiene caracteres Unicode, use lo siguiente:
let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7
En Swift 2.0 la count
ya no funciona. Puedes usar esto en su lugar:
var testString = "Scott"
var length = testString.characters.count
En Xcode 6.1.1
extension String {
var length : Int { return self.utf16Count }
}
Creo que los cerebritos cambiarán esto en cada versión menor.
En swift4 siempre he usado string.count
hasta hoy he encontrado que
string.endIndex.encodedOffset
es la mejor sustitución porque es más rápida: para 50 000 caracteres, la cadena es aproximadamente 6 veces más rápida que .count
. El .count
depende de la longitud de la cadena, pero .endIndex.encodedOffset
no.
Pero hay un NO. No es bueno para cadenas con emojis, dará un resultado incorrecto, por lo que solo .count
es correcto.
Esto es lo que terminé haciendo.
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
La mejor manera de contar String en Swift es esta:
var str = "Hello World"
var length = count(str.utf16)
Obtener valor de cadena de su vista de texto o campo de texto:
let textlengthstring = (yourtextview?.text)! as String
Encuentra el recuento de los caracteres en la cadena:
let numberOfChars = textlength.characters.count
Para XCode 7.3 y Swift 2.2.
let str = "🐶"
1) Si desea el número de caracteres visuales:
str.characters.count // 1
2) Si desea las 16-bit code units within the string''s UTF-16 representation
:
str.utf16.count // 2
La mayoría de las veces, 1) es lo que necesitas.
¿Cuándo necesitarías 2)? He encontrado un 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
Si usas 1), el resultado es incorrecto:
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog🐶🐶🐶
Podrías intentarlo así
var test1: String = "Scott"
var length = test1.bridgeToObjectiveC().length
Puedes obtener la longitud simplemente escribiendo una extensión:
extension String {
// 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
}
}
Si solo está intentando ver si una cadena está vacía o no (verificando la longitud de 0), Swift ofrece un método de prueba booleano simple en String
myString.isEmpty
El otro lado de esta moneda era gente que preguntaba en ObjectiveC cómo preguntar si una cadena estaba vacía, donde la respuesta era verificar una longitud de 0:
String y NSString son puentes gratuitos, por lo que puede usar todos los métodos disponibles para NSString con Strift String
let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count
Swift 2.0: Obtén un recuento: yourString.text.characters.count
Un ejemplo divertido de cómo esto es útil sería mostrar una cuenta regresiva de caracteres de algún número (150 por ejemplo) en un UITextView:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
Swift 4
let str = "Your name"
str.count
Recuerde: el espacio también se cuenta en el número
en Swift 2.x lo siguiente es cómo encontrar la longitud de una cadena
let findLength = "This is a string of text"
findLength.characters.count
devuelve 24
Actualización de Swift 1.2: ya no hay un número de elementos para contar el tamaño de las colecciones. Simplemente use la función de conteo como reemplazo: count ("Swift")
Swift 2.0, 3.0 y 3.1:
vamos a strLength = string.characters.count
Swift 4.0: [Documentación de Apple - Cadenas]
let strLength = string.count
A partir de Swift 4
Es solo
test1.count
por razones.
(Gracias a Martin R)
A partir de Swift 2:
Con Swift 2, Apple ha cambiado las funciones globales a las extensiones de protocolo, extensiones que coinciden con cualquier tipo que se ajuste a un protocolo. Así, la nueva sintaxis es:
test1.characters.count
(Gracias a JohnDifool por los heads up)
A partir de Swift 1
Utilice el método de contar caracteres:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has /(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
desde la Guía de Apple Swift
(nota, para versiones de Swift anteriores a 1.2, esto sería countElements(unusualMenagerie)
lugar)
para su variable, seria
length = count(test1) // was countElements in earlier versions of Swift
O puedes usar test1.utf16count
Actualización de Swift 4 en comparación con Swift 3
Swift 4 elimina la necesidad de una matriz de caracteres en String. Esto significa que puede llamar directamente al count
en una cadena sin obtener primero la matriz de caracteres.
"hello".count // 5
Mientras que en swift 3, tendrás que obtener una matriz de caracteres y luego contar el elemento en esa matriz. Tenga en cuenta que este método siguiente todavía está disponible en swift 4.0, ya que aún puede llamar a los characters
para acceder a la matriz de caracteres de la cadena dada
"hello".characters.count // 5
Swift 4.0 también adopta Unicode 9 y ahora puede interpretar clústeres de grafemas. Por ejemplo, contar con un emoji le dará 1 mientras que en Swift 3.0, puede obtener conteos mayores que 1.
"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨❤️💋👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4
Swift 4
"string".count
;)
Swift 3
extension String {
var length: Int {
return self.characters.count
}
}
uso
"string".length
tl; dr Si desea la longitud de un tipo de cadena en términos de la cantidad de caracteres legibles, utilice countElements () . Si desea conocer la longitud en términos de la cantidad de agrupamientos de grafemas extendidos , use endIndex . Siga leyendo para más detalles.
El tipo de cadena se implementa como una colección ordenada (es decir, secuencia) de caracteres Unicode, y se ajusta al protocolo CollectionType , que se ajusta al protocolo _CollectionType , que es el tipo de entrada esperado por countElements () . Por lo tanto, se puede llamar a countElements () , pasando un tipo de cadena , y devolverá el conteo de caracteres.
Sin embargo, al ajustarse a CollectionType , que a su vez se ajusta a _CollectionType , String también implementa las propiedades computadas startIndex y endIndex , que en realidad representan la posición del índice antes del primer grupo de caracteres, y la posición del índice después del último conjunto de caracteres, respectivamente . Entonces, en la cadena "ABC", la posición del índice antes de A es 0 y después de C es 3. Por lo tanto, endIndex = 3, que también es la longitud de la cadena.
Entonces, endIndex puede usarse para obtener la longitud de cualquier tipo de String, ¿verdad?
Bueno, no siempre ... Los caracteres Unicode son en realidad agrupaciones de grafemas extendidos , que son secuencias de uno o más escalares Unicode combinados para crear un solo carácter legible por humanos.
let circledStar: Character = "/u{2606}/u{20DD}" // ☆⃝
circledStar es un solo personaje formado por U + 2606 (una estrella blanca) y U + 20DD (un círculo que incluye una combinación). Vamos a crear un String de circledStar y comparar los resultados de countElements () y endIndex .
let circledStarString = "/(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
let str = "Hello"
let count = str.length // returns 5 (Int)
extension String {
var length: Int { return countElements(self) } // Swift 1.1
}
extension String {
var length: Int { return count(self) } // Swift 1.2
}
extension String {
var length: Int { return characters.count } // Swift 2.0
}
test1.characters.count
te dará el número de letras / números, etc. en tu cadena.
ex:
test1 = ""
print(test1.characters.count)
( impresiones " 13 ")
var str = "Hello, playground"
var newString = str as NSString
countElements(str)
Esto cuenta a los personajes en Cadena Swift Regular
countElements((newString as String))
Esto cuenta los personajes en una NSString.