Как я могу изменить текстовое представление, отображаемое для типа в Swift?
как я могу изменить текстовый вывод, который отображается в Строковой интерполяции?
The Printable
протокол выглядит наиболее очевидным, но он игнорируется как при интерполяции строк, так и при печати экземпляра, например:
struct Point : Printable
{
var x = 0
var y = 0
var description : String {
return "((x), (y))"
}
func toString() -> String {
return description
}
}
аналогично toString()
конвенция также не имеет никакого эффекта:
var p = Point(x: 10, y: 20)
println(p) // V11lldb_expr_05Point (has 2 children)
println("(p)") // V11lldb_expr_05Point (has 2 children)
println(p.description) // (10, 20)
println("(p.description)") // (10, 20)
поведение снова отличается в PlayGround, который использует свое собственное строковое представление для структур, т. е.:
p // {x 10, y 20}
есть ли способ I можно ли изменить способ отображения экземпляра?
4 ответа:
Свифт 2 - 4
резюме
соответствуют
CustomStringConvertible
протокол и добавитьdescription
:var description: String { return "description here" }
пример
вы можете создать несколько структур:
struct Animal : CustomStringConvertible { let type : String var description: String { return type } } struct Farm : CustomStringConvertible { let name : String let animals : [Animal] var description: String { return "\(name) is a \(self.dynamicType) with \(animals.count) animal(s)." } }
если вы их инициализации:
let oldMajor = Animal(type: "Pig") let boxer = Animal(type: "Horse") let muriel = Animal(type: "Goat") let orwellsFarm = Farm(name: "Animal Farm", animals: [oldMajor, boxer, muriel])
пользовательские описания появятся на вашей игровой площадке:
см. также
CustomDebugStringConvertible
, который вы можете использовать для более подробного вывода во время отладка.
Примечание По Использованию
вы можете инициализировать
String
из любого типа без реализации этого протокола. Например:по этой причине документы говорят:
используя
CustomStringConvertible
как общее ограничение, или доступ к соответствующему типуdescription
непосредственно, поэтому не рекомендуется.
Соответствующие Документы Apple Swift
Apple приводит такой пример:
struct MyType: Printable { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled"
если вы попробуете это на детской площадке, вы получите ту же проблему, что и вы (
V11lldb_expr...
). В playground вы получаете описание с правой стороны при вызове инициализатора, ноprintln
не возвращает что-то разборчиво.вне игровой площадки, однако, этот код ведет себя так, как вы ожидали бы. Как ваш код и пример кода от Apple выше выведите правильный
description
при использовании в контексте без игровой площадки.Я не думаю, что вы можете изменить это поведение на игровой площадке. Это также может быть просто ошибка.
EDIT: я почти уверен, что это ошибка; Я представил отчет об ошибке в Apple.
обновление: в Swift 2, вместо
Printable
используйтеCustomStringConvertible
( соответствующая ссылка на документ).struct MyType: CustomStringConvertible { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled"
это похоже на ошибку на детской площадке. Если вы на самом деле компилируете и запускаете программу нормально, она печатает:
(10, 20) (10, 20) (10, 20) (10, 20)
как ожидается.
вы должны сообщить об этом в https://bugreport.apple.com