Quel est l'équivalent Swift de Java toString()
pour imprimer l'état d'une instance de classe?
La propriété description
est ce que vous recherchez. C'est la propriété à laquelle vous accédez lorsque vous imprimez une variable contenant un objet.
Vous pouvez ajouter description
à vos propres classes en adoptant le protocole CustomStringConvertible
, puis en implémentant la propriété description
.
class MyClass: CustomStringConvertible {
var val = 17
public var description: String { return "MyClass: \(val)" }
}
let myobj = MyClass()
myobj.val = 12
print(myobj) // "MyClass: 12"
description
est également utilisé lorsque vous appelez le constructeur String
:
let str = String(myobj) // str == "MyClass: 12"
C'est la méthode recommandée pour accéder à la description de l'instance (contrairement à myobj.description
qui ne fonctionnera pas si une classe n'implémente pas CustomStringConvertible
)
S'il est possible d'utiliser la structure à la place de la classe, il n'y a rien de plus à faire.
struct juste s'imprime bien à la sortie
print("\(yourStructInstance)")
ou avec classe comme ceci:
print(String(describing: yourClassInstance))
Vous devriez utiliser String(obj)
.
Direct from la documentation de CustomStringConvertible :
REMARQUE
String (instance) fonctionnera pour une instance de tout type, en renvoyant son description si l'instance est CustomStringConvertible . Utiliser CustomStringConvertible comme contrainte générique ou accéder à un fichier conforme directement à la description du type, est donc déconseillée.
NSObject
classes étenduesSi votre classe de modèle est étendue à partir de NSObject
, vous devez remplacer la variable description
comme suit:
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}"
}
Vous pouvez vérifier comment je l’ai fait ici, dans la classe Country
, dans "Bibliothèque CountryPicker iOS Swift" .
Ou, pour faciliter la compréhension, votre classe et la méthode description
devraient ressembler à ce qui suit:
public class MyClass: NSObject {
public var memberAttribute = "I'm an attribute"
public override var description: String {
return "My Class member: \(self.memberAttribute)"
}
}
Remarque: Étant donné que vous étendez votre classe Modal à partir de NSObject
, votre classe n'est plus obligée de se conformer à la classe CustomStringConvertible
et vous redéfinissez la variable description
à partir de la classe NSObject
. Rappelez-vous toujours que CustomStringConvertible
est principalement le moyen le plus simple pour y parvenir.