¿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 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)
String(obj)?
.debugDescriptionuna 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 CustomStringConvertiblesería suficiente.
NSObjectclases extendidasSi 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.