advertencia: los 'caracteres' están en desuso: utilice String o Substring directamente

162

caracteres : una propiedad de instancia de String, está en desuso con Xcode 9.1

Fue muy útil obtener una subcadena de String mediante el uso de la characterspropiedad, pero ahora ha quedado en desuso y Xcode sugiere su uso substring. Traté de verificar las preguntas SO y los tutoriales / pautas para desarrolladores de Apple para lo mismo. Pero no pude ver ninguna solución / alternativa como se sugiere.

Aquí hay un mensaje de advertencia:

los 'caracteres' están en desuso: utilice String o Substring

ingrese la descripción de la imagen aquí

Tengo tantas operaciones de cadena que se realizan / manejan usando la propiedad characters.

¿Alguien tiene alguna idea / información sobre esta actualización?

Krunal
fuente
55
Aquí hay un artículo interesante sobre los Stringcambios de Swift 3 a 4 y lea también SE0163
vadiano
55
intenta usar counten su lugar.
holex
1
Si estaba utilizando string.characters.forEachla nueva API esstring.forEach { char in process(char) }
Efren

Respuestas:

270

Swift 4 introdujo cambios en la cadena de API.
Puedes usar en !stringValue.isEmptylugar destringValue.characters.count > 0

para obtener más información, obtenga la muestra desde aquí

por ej.

let edit = "Summary"
edit.count   // 7
songxunzhao
fuente
Gracias por su respuesta. Pero puedo tener una referencia detallada de la subcadena. Este ejemplo es sólo la muestra, no tengo tantas otras operaciones que se ocupan de caracteres
Krunal
1
Por favor, consulte la información detallada desde aquí. developer.apple.com/library/content/documentation/Swift/…
songxunzhao
let greeting = "Hola, mundo!" let index = greeting.index (de: ",") ?? greeting.endIndex let
begin
1
Referencia en línea para la subcadena .
Dennis Vennink
32
Nunca use count> 0 para verificar si una colección está vacía. Hay una propiedad en Collection llamada isEmpty exactamente para eso. De los documentos Cuando necesite verificar si su colección está vacía, use la propiedad isEmpty en lugar de verificar que la propiedad count sea igual a cero. Para las colecciones que no se ajustan a RandomAccessCollection, el acceso a la propiedad count itera a través de los elementos de la colección.
Leo Dabus
82

Swift 4 vs Swift 3 ejemplos:

let myString = "test"

for char in myString.characters {print(char) } // Swift 3
for char in myString { print(char) } // Swift 4

let length = myString.characters.count // Swift 3
let length = myString.count // Swift 4
Mohammad Sadegh Panadgoo
fuente
2
Esta debería ser la respuesta aceptada. La pregunta es sobre el reemplazo de string.characters.count, no el reemplazo para comparar con cero; eso solo se menciona en la captura de pantalla.
Timothy Kanski
9

Uno de los casos más comunes para manipular cadenas es con respuestas JSON. En este ejemplo, creé una extensión en mi aplicación de reloj para soltar los últimos (n) caracteres de un objeto JSON de Bitcoin.

Swift 3:

func dropLast(_ n: Int = 0) -> String {
    return String(characters.dropLast(n))

Mensaje de error de Xcode 9.1:

los 'caracteres' están en desuso: utilice String o Substring directamente

Xcode nos dice que usemos la variable de cadena o el método directamente .

Swift 4:

func dropLast(_ n: Int = 0) -> String {
    return String(dropLast(n))
    }

Extensión completa:

extension String {
    func dropLast(_ n: Int = 0) -> String {
        return String(dropLast(n))
    }

    var dropLast: String {
        return dropLast()
    }
}

Llamada:

print("rate:\(response.USDRate)")
let literalMarketPrice = response.USDRate.dropLast(2)
print("literal market price: \(literalMarketPrice)")

Consola:

//rate:7,101.0888 //JSON float
//literal market price: 7,101.08 // JSON string literal

Ejemplos adicionales:

  • print("Spell has \(invisibleSpellName.count) characters.")
  • return String(dropLast(n))
  • return String(removeLast(n))

Documentación:

A menudo a utilizar métodos comunes tales como dropLast()o removeLast(), o countpor lo que aquí está la documentación de Apple explícita para cada método.

droplast ()

removelast ()

contando personajes

Edison
fuente
2

Use esto charactersporque Stringdejó de ser una colección en Swift 2.0. Sin embargo, esto sigue siendo un código válido en Swift 4, pero ya no es necesario ahora que Stringes un Collectionnuevo.

Por ejemplo, un Swift 4 Stringahora tiene una propiedad de recuento directo que da el recuento de caracteres:

// Swift 4
let spString = "Stack"
spString.count           // 5

Ejemplos para String y SubString.

Cuerda

Swift 4 Stringahora obtiene directamente Element que le da el primer carácter de String:(string.characters.first)

let spString = "Stack"
let firstElement = spString.first   //S

Subcadena

Usando SubString obtén el primer carácter.

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W
Pranavan Sp
fuente
Quiero obtener el primer carácter de la cadena, así que quiero saber de qué manera debo usar let firstElement = spString.first o Substring?
Pulkit
1
@Pulkit Mejor usar .firstporque si la cadena está ""vacía. solo devolverá nil pero substringproducirá un error.
Pranavan Sp
cómo convertir esta línea de código a swift 4 'AuthorImageText = String (val.characters [(AuthorName.startIndex)]). capitalized'
Pulkit
@Pulkit solo elimina lo .characterssuficiente
Pranavan Sp
0

También puede usar este código para agrupar el diccionario sin usar {$ 0.characters.first! }.

let cities = ["Shanghai": 24_256_800, "Karachi": 23_500_000, "Beijing": 21_516_000, "Seoul": 9_995_000]
let groupedCities = Dictionary(grouping: cities.keys) { $0.first! }
print(groupedCities)
mahendra solanki
fuente
0

Simplemente elimine caracteres. Por ejemplo:

stringValue.characters.count a stringValue.count

Ayoub Bouya
fuente