Какой протокол мне нужно реализовать для управления способом представления объекта в строковой интерполяции в Swift?
Я не хочу указывать, что печатается в чем-то вроде этого:
struct A{
}
var a = A()
println("\(a)")
Какой протокол мне нужно реализовать для управления способом представления объекта в строковой интерполяции в Swift?
Я не хочу указывать, что печатается в чем-то вроде этого:
struct A{
}
var a = A()
println("\(a)")
Вам необходимо реализовать протокол Printable
:
Этот протокол должен быть принят типами, которые хотят настроить их текстовое представление. Это текстовое представление используется, когда объекты записываются в
OutputStreamType
.
protocol Printable {
var description: String { get }
}
Также существует протокол DebugPrintable
, когда он предназначен только для целей отладки:
Этот протокол должен быть принят типами, которые хотят настроить их текстовое представление используется для целей отладки. Эта текстовое представление используется, когда объекты записываются в
OutputStreamType
.
protocol DebugPrintable {
var debugDescription: String { get }
}
Documentation (спасибо @MartinR)
Примечание.. Как упоминалось в комментариях @Antonio и @MartinR, это не работает на игровой площадке (как и Xcode6 GM); это известная ошибка. Он работает в скомпилированных приложениях.
Из примечаний к выпуску GM Xcode6:
В игровых площадках println() игнорирует соответствие печати определяемые пользователем. (16562388)
Начиная с Swift 2.0 Printable
теперь стало CustomStringConvertible
. Все остается прежним, вам все равно нужно реализовать
var description: String { get }
Но теперь его называют CustomStringConvertible. И debug - CustomDebugStringConvertible
Я хотел бы предложить альтернативное решение здесь:
Протокол для строковой интерполяции в Swift - StringInterpolationConvertible
. То есть любой класс, реализующий протокол, может быть построен из строковой интерполяции.
Вернемся к вопросу, чтобы контролировать то, что распечатывается для строковой интерполяции экземпляров класса A
, вам нужно создать расширение строки и перегрузить init(stringInterpolationSegment expr: A)
.
extension String {
init(stringInterpolationSegment expr: A) {
//do custom work here
//for example: self.init(expr.description)
}
}
В случае, если вы ищете способ удалить раздражающий "Необязательный (...)" при интерполировании Необязательные переменные, которые, по моему мнению, являются основной причиной, по которой люди хотели бы контролировать, как объект распечатывается, просто посмотрите на pod NoOptionalInterpolation здесь.
Дополнительная информация (отредактирована):
Подтвердите, что переопределение description
будет работать только для вашей собственной структуры/класса, но не для существующих структур/классов, таких как Int
и Optional
.
В Swift 5 Apple ввела пользовательскую интерполяцию строк.
Предположим, у вас есть структура person с двумя свойствами name и age.
struct Person {
var name: String
var age: Int
}
Если вы хотите добавить для этого специальную интерполяцию строк, чтобы мы могли печатать людей описательным способом, мы можем добавить расширение к String.StringInterpolation с помощью нового метода appendInterpolation().
extension String.StringInterpolation {
mutating func appendInterpolation(_ person: Person) {
appendInterpolation("My name is \(person.name) and I'm \(person.age) years old.")
}
}
Теперь, если мы печатаем детали человека, как:
let person = Person(name: "Yogendra", age: 28)
print("Person Details: \(person)")
Выход будет:
Person Details: My name is Yogendra and I'm 28 years old.