SwiftUI文本视图不显示不可显示的字符

时间:2020-03-01 04:27:12

标签: swift swiftui

我有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 个答案:

答案 0 :(得分:3)

您可以使用Unicode.Scalar方法escaped(asASCII: Bool)将不可打印的字符转换为字符串:

func escaped(asASCII forceASCII: Bool) -> String

标量值,表示通常不可打印的字符或 否则需要转义的字符会以反斜杠转义。

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}