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
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 protocoloCustomStringConvertible
y luego implementando ladescription
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 alString
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 implementaCustomStringConvertible
)fuente
String(obj)
?.debugDescription
una 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 deCustomStringConvertible
sería suficiente.Cómo se hace con
NSObject
clases extendidasSi su clase de modelo se extiende desde
NSObject
, debe anular la Variable de ladescription
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 laCustomStringConvertible
clase, y está anulando ladescription
variable de laNSObject
clase en sí. Recuerde siempre,CustomStringConvertible
es principalmente la forma Swift pura de lograr esto.fuente