2014-09-12 22 views

Odpowiedz

23

trzeba zaimplementować protokół Printable:

Protokół ten powinien zostać przyjęty do typów, które chcą dostosować ich reprezentacja tekstowa. Ta reprezentacja tekstowa jest używana, gdy obiekty są zapisywane do OutputStreamType.

protocol Printable { 
    var description: String { get } 
} 

Jest też protokół DebugPrintable kiedy jest tylko do celów debugowania:

Protokół ten powinien zostać przyjęty do typów, które chcą dostosować ich tekstową reprezentację wykorzystywane do celów diagnostycznych. Ta reprezentacja tekstowa jest używana, gdy obiekty są zapisywane pod adresem OutputStreamType.

protocol DebugPrintable { 
    var debugDescription: String { get } 
} 

Documentation (Dzięki @MartinR)

Uwaga: W @Antonio i @MartinR wspomniano w komentarzach, to nie działa na placu zabaw (od Xcode6 GM w każdym razie) ; to znany błąd. Działa w skompilowanych aplikacjach.

Z Xcode6 GM Release Notes:

na placach zabaw, println() ignoruje druku zgodność z typów zdefiniowanych przez użytkownika. (16562388)

jako Swift 2,0 Printable stał się CustomStringConvertible. Wszystko pozostaje takie samo jak przedtem, trzeba jeszcze wdrożyć

var description: String { get } 

ale teraz jego nazwie CustomStringConvertible. I debugowania jest CustomDebugStringConvertible

+1

Czy jesteś pewien, że to działa? Myślałem, że to samo, próbowałem na boisku i to widać coś w rodzaju '__lldb_expr_551. Test "Niezależnie od' Wydrukowanego 'zaimplementowanego lub nie – Antonio

+1

Dokumentacja jest również dostępna tutaj: https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibr aryReference/Printing.html. –

+1

Interesujące. Działa w skompilowanej aplikacji, ale nie na placu zabaw. –

1

Chciałbym umieścić alternatywne rozwiązanie tutaj:

Protokół interpolacji smyczkowy w Swift jest StringInterpolationConvertible. Oznacza to, że każda klasa implementująca protokół może być zbudowana z interpolacji ciągów znaków.

Wracając do pytania, aby kontrolować, co jest wydrukowane dla interpolacji ciągów łańcuchowych instancji klasy A, konieczne jest utworzenie rozszerzenia String i przeciążenie funkcji init(stringInterpolationSegment expr: A).

extension String { 
    init(stringInterpolationSegment expr: A) { 
     //do custom work here 
     //for example: self.init(expr.description) 
    } 
} 

Jeśli szukasz sposobu na usunięcie irytującego "Opcjonalnie (...)”Podczas interpolacji zmiennych opcjonalne, co moim zdaniem jest głównym powodem, dlaczego ludzie chcą kontrolować, w jaki sposób obiekt zostanie wydrukowany, wystarczy spojrzeć na kapsule NoOptionalInterpolation here

Dodatkowe informacje (edycji). Potwierdź tego nadrzędnego description będzie działać tylko dla własnego struct/klasy, ale nie dla istniejącego struct/klasy, takie jak Int i Optional.

Powiązane problemy