В Objective-C можно добавить description
метод к их классу, чтобы помочь в отладке:
@implementation MyClass
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end
Затем в отладчике вы можете сделать:
po fooClass
<MyClass: 0x12938004, foo = "bar">
Что эквивалентно в Swift? Вывод REPL Swift может быть полезным:
1> class MyClass { let foo = 42 }
2>
3> let x = MyClass()
x: MyClass = {
foo = 42
}
Но я хотел бы переопределить это поведение для печати на консоли:
4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
Есть ли способ очистить этот println
вывод? Я видел Printable
протокол:
/// 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 }
}
Я подумал, что это будет автоматически "видно", println
но это не так:
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)
И вместо этого я должен явно вызвать описание:
8> println("x = \(x.description)")
x = MyClass, foo = 42
Есть ли способ лучше?
Пример использования
CustomStringConvertible
иCustomDebugStringConvertible
протоколы в Swift:PageContentViewController.swift
ViewController.swift
Какой распечатать:
Примечание: если у вас есть собственный класс, который не наследуется ни от какого класса, включенного в библиотеки UIKit или Foundation , то сделайте его наследником
NSObject
класса или сделайте так, чтобы он соответствовал протоколамCustomStringConvertible
иCustomDebugStringConvertible
протоколам.источник
Просто используйте
CustomStringConvertible
иvar description: String { return "Some string" }
работает в Xcode 7.0 beta
источник
Ответы, касающиеся
CustomStringConvertible
пути. Лично, чтобы сохранить определение класса (или структуры) как можно более чистым, я бы также выделил код описания в отдельное расширение:источник
источник
Как описано здесь , вы также можете использовать возможности отражения Swift, чтобы ваши классы генерировали свое собственное описание, используя это расширение:
источник
источник