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)

vacawama
fuente
¿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))
Andrés
fuente
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.

Ewan Mellor
fuente
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.

Randika Vishman
fuente