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.
classMyClass: CustomStringConvertible{
var val = 17publicvar description: String { return"MyClass: \(val)" }
}
let myobj = MyClass()
myobj.val = 12print(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 (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.
O, para que le resulte más fácil de entender, su clase y descriptionmétodo deberían tener el siguiente aspecto:
publicclassMyClass: NSObject{
publicvar memberAttribute = "I'm an attribute"publicoverridevar 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.
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 protocoloCustomStringConvertibley luego implementando ladescriptionpropiedad.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 alStringconstructor: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 implementaCustomStringConvertible)fuente
String(obj)?.debugDescriptionuna versión más amigable para los programadoresSi 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))fuente
Deberías usar
String(obj).Directamente de la documentación de CustomStringConvertible :
fuente
description()método deCustomStringConvertiblesería suficiente.Cómo se hace con
NSObjectclases extendidasSi su clase de modelo se extiende desde
NSObject, debe anular la Variable de ladescriptionsiguiente 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 laCustomStringConvertibleclase, y está anulando ladescriptionvariable de laNSObjectclase en sí. Recuerde siempre,CustomStringConvertiblees principalmente la forma Swift pura de lograr esto.fuente