153 votes

Qu'est-ce que la Swift équivalent de[NSObject description]?

En Objective-C, on peut ajouter un description méthode dans leur classe pour faciliter le débogage:

@implementation MyClass
- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end

Puis dans le débogueur, vous pouvez le faire:

po fooClass
<MyClass: 0x12938004, foo = "bar">

Quel est l'équivalent en Swift? Swift REPL sortie peut être utile:

  1> class MyClass { let foo = 42 }
  2> 
  3> let x = MyClass()
x: MyClass = {
  foo = 42
}

Mais j'aimerais remplacer ce comportement pour l'impression de la console:

  4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)

Est-il un moyen de nettoyer cette println la production? J'ai vu l' Printable protocole:

/// This protocol should be adopted by types that wish to customize their
/// textual representation.  This textual representation is used when objects
/// are written to an `OutputStream`.
protocol Printable {
    var description: String { get }
}

J'ai pensé que ce serait automatiquement être "vu" par println , mais il ne semble pas être le cas:

  1> class MyClass: Printable {
  2.     let foo = 42
  3.     var description: String { get { return "MyClass, foo = \(foo)" } }
  4. }   
  5> 
  6> let x = MyClass()
x: MyClass = {
  foo = 42
}
  7> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)

Et à la place j'ai appeler explicitement description:

 8> println("x = \(x.description)")
x = MyClass, foo = 42

Est-il un meilleur moyen?

113voto

drewag Points 12938

Par le biais de l'expérimentation, j'ai découvert que l' Printable et DebugPrintable des protocoles de travail lors de la compilation d'une application réelle, mais pas dans le REPL ou aire de Jeux.

Remarque: Le code que tu as écrit est juste, mais dans ce cas, vous êtes probablement à la recherche d' DebugPrintable

53voto

alino-91 Points 30

Exemple d'utilisation Imprimable et DebugPrintable protocoles Swift:

PageContentViewController.swift

import UIKit

class PageContentViewController: UIViewController, Printable, DebugPrintable {

    var pageIndex : Int = 0

    override var description : String { 
        return "**** PageContentViewController\npageIndex equals \(pageIndex) ****\n" 
    }

    override var debugDescription : String { 
        return "---- PageContentViewController\npageIndex equals \(pageIndex) ----\n" 
    }

            ...
}

ViewController.swift

import UIKit

class ViewController: UIViewController
{

    /*
        Called after the controller's view is loaded into memory.
    */
    override func viewDidLoad() {
        super.viewDidLoad()

        var myPageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("A") as PageContentViewController
        println(myPageContentViewController)       
        println(myPageContentViewController.description)
        println(myPageContentViewController.debugDescription)
    }

          ...
}

Ce qui affichera:

**** PageContentViewController
pageIndex equals 0 ****

**** PageContentViewController
pageIndex equals 0 ****

---- PageContentViewController
pageIndex equals 0 ----

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X