8
votes

Que se passe-t-il lorsque vous imprimez un objet Swift (PO) dans LLDB?

dans objectif-c , lorsque vous nslog un objet ou po it in lldb , l'objet reçoit Le message message .

Swift Toutefois, le comportement semble être différent. J'ai mis en œuvre les deux imprimable (nécessite Description Propriété) et débogué (qui nécessite à son tour une propriété nommée débududescription ). Si j'essaie de println () un objet ou po it, aucune de ces propriétés n'est appelée.

Qu'est-ce qui se passe? Quels sont ces protocoles pour ensuite ??


0 commentaires

3 Réponses :


6
votes

Il y a un problème connu que imprimable code> est ignoré par le Swift Repl (c'est-à-dire quoi que ce soit dans un terrain de jeu ou exécuté par xcrun swift code> à la ligne de commande) mais reconnu par le compilateur (apps compilé dans le simulateur ou xcrun swiftc code>).

Par exemple, voici le code de "foo.swift": p> xxx pré>

si je l'exécute à l'aide de la replaction, je reçois ceci: p>

$ xcrun -sdk macosx swiftc foo.swift ; ./foo
Nate


3 commentaires

Qui aurait pensé ... merci! ;-)


BTW, si cette description est-elle réellement des raisons de mettre en œuvre de débogage?


@cfisher je n'ai aucune idée! :)



4
votes

Juste pour ajouter quelques détails de plus à la réponse de Nate:

  • en Xcode 6, lorsque vous essayez de "PO" un objet Swift, l'une des deux choses se produit:

    • L'objet est en fait un objet de l'objectif-c (E.G. Nswindow, Nstring) ou une option de ce type. Dans ce cas, LLDB Début si nécessaire, puis appelle NSprintfordeBugger (Objcpoinger). Cela signifie que les objets Objc devraient "po" de la même manière à Swift que dans l'objectif-C

    • L'objet est en fait un objet Swift. Dans ce cas, LLDB utilise ses propres formateurs de données pour imprimer l'objet, avec quelques modifications mineures pour donner un look "po" ", mais quoi que ce soit des protocoles de votre objet implémente, ils sont ignorés

      En tant qu'amanciement futur, l'idée est que LLDB sera en mesure de demander à la bibliothèque standard SWIFT toDebuggring (objet) et de permettre à la bibliothèque SWIFT de gérer les détails de ce que les opérations signifie - un peu comme NSprintfordebugger () dans l'objectif- C World.

      Dans cet univers amélioré, le contrat de la bibliothèque standard pourrait très bien être que la mise en œuvre imprimable, ou débogurée de débogage, affecterait le résultat de TODEBUGUGING (). LLDB attraperait automatiquement parce que cela vient de déléguer la responsabilité.

      Même dans un tel univers amélioré, votre kilométrage en mode REP varie en raison de la limitation du JIT. Incidemment, la même limitation vous empêche de définir un type dans une aire de jeux et de personnaliser la manière dont elle est présentée (cela nécessiterait de mettre en œuvre au moins l'un des protocoles reflects / miroirs)


3 commentaires

Mais Tous les objets Swift sont des objets Objective-C - Tous les objets peuvent être utilisés avec l'exécution de l'objectif-C (tous les membres peuvent être disponibles pour objectif-c; mais l'objet lui-même est tout aussi bon un objet comme tout autre objet)


Eh bien, pour une structure et des énormes ne sont pas des objets dans ce sens. Mais oui, laissez-moi être un peu plus spécifique: l'ancien comportement s'applique aux instances de types @class importés de l'objectif-c


En réalité Non La classe Swift est une classe Objective-C. Vous faites des classes de l'objectif-C en faisant des sous-classes d'une classe Objective-C, telle que NsObject ou en déclarant la classe précédée de @OBJC .



0
votes

Essayez:

dump(object)


0 commentaires