dans Swift Toutefois, le comportement semble être différent. J'ai mis en œuvre les deux Qu'est-ce qui se passe? Quels sont ces protocoles pour ensuite ?? p> objectif-c code>, lorsque vous
nslog code> un objet ou
po code> it in
lldb code>, l'objet reçoit Le message code> message code>. P>
imprimable code> (nécessite
Description code> Propriété) et
débogué code> (qui nécessite à son tour une propriété nommée
débududescription code>). Si j'essaie de
println () code> un objet ou
po code> it, aucune de ces propriétés n'est appelée. P>
3 Réponses :
Il y a un problème connu que Par exemple, voici le code de "foo.swift": p> si je l'exécute à l'aide de la replaction, je reçois ceci: p> 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>).
$ xcrun -sdk macosx swiftc foo.swift ; ./foo
Nate
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! :)
Juste pour ajouter quelques détails de plus à la réponse de Nate: P>
en Xcode 6, lorsque vous essayez de "PO" un objet Swift, l'une des deux choses se produit: p>
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 p> li>
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 p> li> ul> li> ul>
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. P>
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é. P>
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) P>
Mais Tous les objets i> 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 i> de l'objectif-c
En réalité Non B> 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 code> ou en déclarant la classe précédée de
@OBJC code>.
Essayez:
dump(object)