web-dev-qa-db-fra.com

Équivalent Swift de Java toString ()

Quel est l'équivalent Swift de Java toString() pour imprimer l'état d'une instance de classe?

57
Marcus Leon

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)

80
vacawama

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))
6
Andrey

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.

6
Ewan Mellor

Comment faire avec NSObject classes étendues

Si 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.

1
Randika Vishman