Equivalente rápido de Java toString ()


Respuestas:


122

La descriptionpropiedad es lo que busca. Esta es la propiedad a la que se accede cuando imprime una variable que contiene un objeto.

Puede agregar descriptiona sus propias clases adoptando el protocolo CustomStringConvertibley luego implementando la descriptionpropiedad.

class MyClass: CustomStringConvertible {
    var val = 17

    public var description: String { return "MyClass: \(val)" }
}

let myobj = MyClass()
myobj.val = 12
print(myobj)  // "MyClass: 12"

descriptiontambién se usa cuando llamas al Stringconstructor:

let str = String(myobj)  // str == "MyClass: 12"

Este es el método recomendado para acceder a la descripción de la instancia (a diferencia del myobj.descriptionque no funcionará si una clase no se implementa CustomStringConvertible)


¿Qué hay de String(obj)?
— nielsbot

También hay .debugDescriptionuna versión más amigable para los programadores
— nielsbot

2
¿Se aplica a las estructuras?
— lmiguelvargasf

1
Sí, CustomStringConvertible reemplazó a Printable. @ Antonio, no recuerdo cuándo cambió, pero ciertamente fue mucho antes de Swift 3.
— vacawama

1
la MyClass debe extenderse de NSObject
— DàChún

7

Si es posible usar la estructura en lugar de la clase, entonces no hay nada más que hacer.

struct solo se imprime bien en la salida

print("\(yourStructInstance)")

o con una clase como esta:

print(String(describing: yourClassInstance))

6

Deberías usar String(obj).

Directamente de la documentación de CustomStringConvertible :

NOTA

String (instancia) funcionará para una instancia de cualquier tipo, devolviendo su descripción si la instancia resulta ser CustomStringConvertible. Por lo tanto, se desaconseja usar CustomStringConvertible como una restricción genérica o acceder directamente a la descripción de un tipo conforme.


Parece que el description()método de CustomStringConvertiblesería suficiente.
— Greg Brown

5

Cómo se hace con NSObjectclases extendidas

Si su clase de modelo se extiende desde NSObject, debe anular la Variable de la descriptionsiguiente manera:

public override var description: String {
    return "\n{\n index: \(self.index),\n"
        + " country: \(self.name),\n"
        + " isoCountryCode: \(self.isoCountryCode),\n"
        + " localeId: \(self.localeId),\n"
        + " flagImageName: \(self.flagImageName!)\n}"
}

Puedes comprobar cómo lo he hecho aquí dentro de la Countryclase , en la "biblioteca CountryPicker iOS Swift" .

O, para que le resulte más fácil de entender, su clase y descriptionmétodo deberían tener el siguiente aspecto:

public class MyClass: NSObject {
   public var memberAttribute = "I'm an attribute"

   public override var description: String {
       return "My Class member: \(self.memberAttribute)"
   }
}

Nota: Dado que está extendiendo su clase modal desde, NSObjectya no es necesario que su clase cumpla con la CustomStringConvertibleclase, y está anulando la descriptionvariable de la NSObjectclase en sí. Recuerde siempre, CustomStringConvertiblees principalmente la forma Swift pura de lograr esto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.