Как я могу изменить текстовое представление, отображаемое для типа в 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 80

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])

пользовательские описания появятся на вашей игровой площадке:

enter image description here

см. также CustomDebugStringConvertible, который вы можете использовать для более подробного вывода во время отладка.


Примечание По Использованию

вы можете инициализировать String из любого типа без реализации этого протокола. Например:

enter image description here

по этой причине документы говорят:

используя 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

при открытии консоли : Просмотр - > Помощник Редактора - > Показать Помощник Редактора вы можете увидеть ожидаемые строки печати Проверено в xCode 6.3.2 с Yosimite 10.10

enter image description here