2014-09-12 7 views
12

Какой протокол мне нужно реализовать для управления способом представления объекта в строковой интерполяции в Swift?Протокол Swift для строковой интерполяции

Я wan't, чтобы указать, что получить напечатано в чем-то вроде этого:

struct A{ 

} 

var a = A() 
println("\(a)") 

ответ

23

Вы должны реализовать Printable протокол:

Этот протокол должен быть принят по типам, которые хотят, чтобы настроить их текстовое представление . Это текстовое представление используется, когда объекты записываются в OutputStreamType.

protocol Printable { 
    var description: String { get } 
} 

Там также протокол DebugPrintable, когда это только для целей отладки:

Этот протокол должен быть принят по типам, которые хотят, чтобы настроить их текстовое представление используется для отладки. Это текстовое представление используется, когда объекты записываются в OutputStreamType.

protocol DebugPrintable { 
    var debugDescription: String { get } 
} 

Documentation (спасибо @MartinR)

Примечание: Как @Antonio и @MartinR упоминается в комментариях, это не работает на детской площадке (по Xcode6 GM в любом случае) ; это известная ошибка. Он работает в скомпилированных приложениях.

От GM Release Notes Xcode6:

В игровые площадки, Println() игнорирует печати соответствие с типов, определяемых пользователем. (16562388)

начиная с Swift 2.0 Printable сейчас стал CustomStringConvertible. Все остается прежним, вам все равно необходимо выполнить

var description: String { get } 

Но теперь его называют CustomStringConvertible. И отладка CustomDebugStringConvertible

+1

Вы уверены, что это работает? Я думал, что то же самое, попробовал на детской площадке, и это показывает, что-то вроде '__lldb_expr_551. Test'. Независимо от версии «Printable» или нет. – Antonio

+1

Также задокументировано здесь: https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibr aryReference/Printing.html. –

+1

Интересно. Он работает в скомпилированном приложении, но не на игровой площадке. –

1

Я хотел бы поставить альтернативное решение здесь:

Протоколом для интерполяции строк в Swift является StringInterpolationConvertible. То есть любой класс, который реализует протокол, может быть построен из интерполяции строк.

Назад к вопросу, чтобы определить, что распечатывается для интерполяции строк строки класса A, вам необходимо создать расширение строки и перегрузить функцию init(stringInterpolationSegment expr: A).

extension String { 
    init(stringInterpolationSegment expr: A) { 
     //do custom work here 
     //for example: self.init(expr.description) 
    } 
} 

В случае, если вы ищете способ удаления раздражающего «Дополнительного (...)», Когда интерполяционный Дополнительные переменные, которые я думаю, главная причина, почему люди хотят, чтобы контролировать, как объект получает распечатаны, просто посмотреть на стручок NoOptionalInterpolation here

Дополнительная информация (отредактированный):. Убедитесь, что переопределяем description будет работать только для вашей собственной структуры/класса, но не для существующей структуры/класса, такие как Int и Optional.

Смежные вопросы