Swift équivalent de Java toString ()

Réponses:

122

La descriptionpropriété est ce que vous recherchez. Il s'agit de la propriété accessible 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 descriptionpropriété.

class MyClass: CustomStringConvertible {
    var val = 17

    public var description: String { return "MyClass: \(val)" }
}

let myobj = MyClass()
myobj.val = 12
print(myobj)  // "MyClass: 12"

descriptionest également utilisé lorsque vous appelez le Stringconstructeur:

let str = String(myobj)  // str == "MyClass: 12"

C'est la méthode recommandée pour accéder à la description de l'instance (par opposition à celle myobj.descriptionqui ne fonctionnera pas si une classe n'est pas implémentée CustomStringConvertible)

vacawama
la source
Et quoi String(obj)?
nielsbot
Il y a aussi .debugDescriptionune version plus conviviale pour les programmeurs
nielsbot
2
s'applique-t-il aux structures?
lmiguelvargasf
1
Oui, CustomStringConvertible a remplacé Printable. @Antonio, je ne me souviens pas quand ça a changé, mais c'était certainement bien avant Swift 3.
vacawama
1
la MyClass doit être étendue de NSObject
DàChún
7

S'il est possible d'utiliser la structure au lieu de la classe, alors rien de plus à faire.

struct s'imprime juste finement sur la sortie

print("\(yourStructInstance)")

ou avec une classe comme celle-ci:

print(String(describing: yourClassInstance))
Andrew
la source
6

Vous devriez utiliser String(obj).

Directement à partir de la documentation de CustomStringConvertible :

REMARQUE

String (instance) fonctionnera pour une instance de n'importe quel type, renvoyant sa description si l'instance se trouve être CustomStringConvertible. L'utilisation de CustomStringConvertible comme contrainte générique, ou l'accès direct à la description d'un type conforme, est donc déconseillée.

Ewan Mellor
la source
On dirait que la description()méthode de CustomStringConvertibleserait suffisante.
Greg Brown
5

Comment c'est fait avec NSObjectles classes étendues

Si votre classe de modèle est étendue à partir de NSObject, vous devez remplacer la variable descriptioncomme 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 au sein de la Countryclasse , dans la "Bibliothèque CountryPicker iOS Swift" .

Ou, pour simplifier votre compréhension, votre classe et votre descriptionméthode doivent ressembler à ceci:

public class MyClass: NSObject {
   public var memberAttribute = "I'm an attribute"

   public override var description: String {
       return "My Class member: \(self.memberAttribute)"
   }
}

Remarque: puisque vous étendez votre classe Modal à partir de NSObjectcelle-ci, il n'est plus nécessaire que votre classe soit conforme à la CustomStringConvertibleclasse, et vous remplacez la descriptionvariable de la NSObjectclasse elle-même. Rappelez-vous toujours que CustomStringConvertiblec'est principalement la manière pure Swift d'y parvenir.

Randika Vishman
la source