¿Cuál es el equivalente Swift de Java toString()
para imprimir el estado de una instancia de clase?
¿Cuál es el equivalente Swift de Java toString()
para imprimir el estado de una instancia de clase?
Respuestas:
La description
propiedad es lo que busca. Esta es la propiedad a la que se accede cuando imprime una variable que contiene un objeto.
Puede agregar description
a sus propias clases adoptando el protocolo CustomStringConvertible
y luego implementando la description
propiedad.
class MyClass: CustomStringConvertible {
var val = 17
public var description: String { return "MyClass: \(val)" }
}
let myobj = MyClass()
myobj.val = 12
print(myobj) // "MyClass: 12"
description
también se usa cuando llamas al String
constructor:
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.description
que no funcionará si una clase no se implementa CustomStringConvertible
)
String(obj)
?
.debugDescription
una versión más amigable para los programadores
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.
description()
método de CustomStringConvertible
sería suficiente.
NSObject
clases extendidasSi su clase de modelo se extiende desde NSObject
, debe anular la Variable de la description
siguiente 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 Country
clase , en la "biblioteca CountryPicker iOS Swift" .
O, para que le resulte más fácil de entender, su clase y description
mé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, NSObject
ya no es necesario que su clase cumpla con la CustomStringConvertible
clase, y está anulando la description
variable de la NSObject
clase en sí. Recuerde siempre, CustomStringConvertible
es principalmente la forma Swift pura de lograr esto.