Pregunta Obtener la longitud de una cadena


¿Cómo se obtiene la longitud de un 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.


680
2018-06-04 12:40


origen


Respuestas:


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 extensiones de protocolo, extensiones que coinciden con cualquier tipo que se ajuste a un protocolo. Por lo tanto, la nueva sintaxis es:

test1.characters.count

(Gracias a JohnDifool por el aviso)

A partir de Swift 1

Usa el método de contar caracteres:

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

directamente desde la Guía Apple Swift

(nota, para las versiones de Swift anteriores a 1.2, esto sería countElements(unusualMenagerie) en lugar)

para su variable, sería

length = count(test1) // was countElements in earlier versions of Swift

O puede usar test1.utf16count


1097
2018-06-04 12:41



TLDR:

por Swift 2.0 y 3.0, utilizar test1.characters.count. Pero, hay algunas cosas que debes saber. Entonces, sigue leyendo.

Contando personajes en Swift

Antes de Swift 2.0, count fue una función global. A partir de Swift 2.0, se puede llamar como una función miembro.

test1.characters.count

Devolverá la cantidad real de caracteres Unicode en un String, por lo que es la alternativa más correcta en el sentido de que, si imprimiera la secuencia y contara los caracteres a mano, obtendría el mismo resultado.

Sin embargo, debido a la forma Strings se implementan en Swift, los caracteres no siempre ocupan la misma cantidad de memoria, así que tenga en cuenta que esto se comporta de manera bastante diferente a los métodos habituales de recuento de caracteres en otros idiomas.

Por ejemplo, también puedes usar test1.utf16.count

Pero, como se indica a continuación, no se garantiza que el valor devuelto sea el mismo que el de llamar count en characters.

De la referencia de idioma:

Los clústeres de grafemas extendidos pueden estar compuestos por uno o más Unicode   escalares. Esto significa que diferentes personajes y diferentes   representaciones del mismo personaje, pueden requerir diferentes cantidades de   memoria para almacenar Debido a esto, los personajes de Swift no toman cada uno   la misma cantidad de memoria dentro de la representación de una cadena. Como un   resultado, el número de caracteres en una cadena no se puede calcular   sin iterar a través de la cadena para determinar su extensión   límites del grupo de grafemas. Si está trabajando con particularmente largo   valores de cadena, tenga en cuenta que la propiedad de los caracteres debe iterar   los escalares Unicode en toda la cadena para determinar el   personajes para esa cadena.

El recuento de los caracteres devueltos por la propiedad de los caracteres no es   siempre lo mismo que la propiedad de longitud de un NSString que contiene   los mismos personajes La longitud de un 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   el número de clústeres de grafemas extendidos Unicode dentro de la cadena.

Un ejemplo que ilustra perfectamente la situación descrita anteriormente es la comprobación de 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

327
2018-06-04 12:41



Actualización de Swift 1.2: ya no hay un conteoElementos para contar el tamaño de las colecciones. Simplemente use la función de recuento como reemplazo: count ("Swift")

 Swift 2.0, 3.0 y 3.1:

let strLength = string.characters.count   


85
2018-04-15 02:08



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
}

57
2017-10-22 20:07



Swift 4

"string".count

;)

Swift 3

extension String {
    var length: Int {
        return self.characters.count
    }
}

uso

"string".length


43
2017-12-24 22:15



Si solo está tratando de 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

La otra cara de esta moneda era que la gente preguntaba en ObjectiveC cómo preguntar si un hilo estaba vacío y la respuesta era verificar que tuviera una longitud de 0:

NSString está vacío


19
2017-08-29 19:54



tl; dr Si desea la longitud de un tipo de Cadena en términos del número de caracteres legibles por el ser humano, use countElements (). Si desea saber la longitud en términos de la cantidad de grupos de grafemas extendidos, utilizar endIndex. Sigue leyendo para más detalles.

los Cuerda tipo se implementa como una colección ordenada (es decir, secuencia) de caracteres Unicode, y se ajusta a la CollectionType protocolo, que se ajusta al _CollectionType protocolo, que es el tipo de entrada esperado por countElements (). Por lo tanto, countElements () puede ser llamado, pasando un Cuerda tipo, y devolverá el recuento de caracteres.

Sin embargo, en conformidad con CollectionType, que a su vez se ajusta a _CollectionType, Cuerda también implementa el Índice de comienzo y endIndex propiedades calculadas, que en realidad representan la posición del índice antes de el primer grupo de caracteres y la posición del índice después el último grupo 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.

Asi que, endIndex se puede utilizar para obtener la longitud de cualquier tipo de cadena, entonces, ¿verdad?

Bueno, no siempre ... Los caracteres Unicode son en realidad grupos de grafemas extendidos, que son secuencias de uno o más Escalares Unicode combinados para crear un único personaje legible por humanos.

let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝

circledStar es un solo carácter compuesto por U + 2606 (una estrella blanca) y U + 20DD (un círculo que lo combina). Vamos a crear un Cuerda de circledStar y compara los resultados de countElements () y endIndex.

let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2

15
2017-08-30 11:06