W Objective-C można dodać description
metodę do swojej klasy, aby ułatwić debugowanie:
@implementation MyClass
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end
Następnie w debugerze możesz wykonać:
po fooClass
<MyClass: 0x12938004, foo = "bar">
Jaki jest odpowiednik w Swift? Wyjście REPL w Swift może być pomocne:
1> class MyClass { let foo = 42 }
2>
3> let x = MyClass()
x: MyClass = {
foo = 42
}
Ale chciałbym zmienić to zachowanie przy drukowaniu na konsolę:
4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
Czy istnieje sposób na wyczyszczenie tego println
wyniku? Widziałem Printable
protokół:
/// 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 }
}
Pomyślałem, że zostanie to automatycznie „zauważone”, println
ale nie wydaje się, aby tak było:
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)
Zamiast tego muszę wyraźnie wywołać opis:
8> println("x = \(x.description)")
x = MyClass, foo = 42
Czy jest lepszy sposób?
Przykład użycia
CustomStringConvertible
iCustomDebugStringConvertible
protokołów w Swift:PageContentViewController.swift
ViewController.swift
Który wydruk:
Uwaga: jeśli masz niestandardową klasę, która nie dziedziczy z żadnej klasy zawartej w bibliotekach UIKit lub Foundation , spraw , aby dziedziczała po
NSObject
klasie lub dostosuj ją do protokołówCustomStringConvertible
iCustomDebugStringConvertible
.źródło
Po prostu użyj
CustomStringConvertible
ivar description: String { return "Some string" }
działa w Xcode 7.0 beta
źródło
Odpowiedzi odnoszące się do tego
CustomStringConvertible
są drogą do zrobienia. Osobiście, aby zachować definicję klasy (lub struktury) tak czystą, jak to tylko możliwe, wydzieliłbym również kod opisu na osobne rozszerzenie:źródło
źródło
Jak opisano tutaj , możesz również użyć funkcji odbicia Swift, aby Twoje klasy generowały własny opis za pomocą tego rozszerzenia:
źródło
źródło