Текстовое представление SwiftUI не показывает не отображаемые символы - PullRequest
2 голосов
/ 01 марта 2020

У меня есть код Swift, который анализирует кадр LLDP (протокол обнаружения канального уровня), включая поле, которое может быть произвольно определено поставщиком. Иногда это строка. Иногда это произвольная структура данных.

Вот как я беру данные и помещаю их в строку с кодировкой .utf8.

        let ouiString = String(data: data[data.startIndex + 6 ..< data.startIndex + 2 + tlvLength], encoding: .utf8) ?? ""

Вот результирующая структура данных (часть перечисления с соответствующее значение). Выше «ouiString» теперь находится в конце поля «info: String».

case ouiSpecific(oui: String, subType: Int, info: String)

Вот как я генерирую описание:

    case .ouiSpecific(let oui, let subType, let info):
        return "OUI \(oui) subType \(subType) \(info)"

Вот пример описания, где исходные данные не были строкой. Не отображаемые символы отображаются так, как я считаю приемлемыми.

(lldb) po value.description
"OUI 00:12:0f subType 5 \0\u{11}\0\u{11}\0\u{11}\0\u{11}\0\u{11}"

Вот как я пытаюсь отобразить его в списке SwiftUI:

        List(lldp.values, id: \.self) { value in
            Text(value.description)
        }

А вот изображение результирующее отображение в SwiftUI. Информационное поле со всеми экранированными неотображаемыми символами не отображается.

SwiftUI List Output

Как отобразить поле в текстовом представлении SwiftUI с не -дисплейные символы экранировали как в выводе "po"?

1 Ответ

3 голосов
/ 01 марта 2020

Вы можете использовать Unicode.Scalar метод escaped(asASCII: Bool), чтобы преобразовать непечатаемые символы в строку:

func escaped(asASCII forceASCII: Bool) -> String

Скалярные значения, представляющие символы, которые обычно не печатаются или которые в противном случае требуют экранирования, экранируются с помощью обратной косой черты. sh.

extension StringProtocol {
    var asciiEscaped: String {
        unicodeScalars.map{$0.escaped(asASCII: true)}.joined()
    }
}

Тестирование игровой площадки:

let str = "\0\u{11}\0\u{11}\0\u{11}\0\u{11}\0\u{11}"
print(str.asciiEscaped)

Будет напечатано:

\ 0 \ u {11 } \ 0 \ u {11} \ 0 \ u {11} \ 0 \ u {11} \ 0 \ u {11}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...