【问题标题】:Parsing Data Out of Dictionary<String, Any> in Swift在 Swift 中从 Dictionary<String, Any> 中解析数据
【发布时间】:2021-10-02 17:24:38
【问题描述】:

我正在尝试从 Swift 中的 Dictionary 中提取数据。当我运行 NSLog("\(terminalDict)") 时,字典返回以下内容:

可选([“DFEE22”:,“DFEE20”:,“DFEE21”:,“DFEE17”:,“DFEE1E”:,“DF10”:、“9F1C”:、“DFEE16”:、“DFEE15”:、“5F36”:、“DF11”:、“DFEE1F”: ,“DFEE18”:,“9F1A”:,“9F35”:,“9F4E”:,“DF26”:,“9F15”:,“9F40”:,“9F16”:,“9F33”:, "9F1E": ])

我想从字典中取出所有键和值并放入一个字符串变量(newSettings)。这就是我尝试这样做的方式:

for (key, value) in terminalDict! {
    NSLog("key is now= \(key)")
    NSLog("value is now= \(value)")
    let asString = value as! String
    print(asString)
    NSLog("Adding \(key) \(asString)")
    newSettings = "\(newSettings)\(key)\(asString)"
  }

返回:

密钥现在= DFEE22
现在的值 = {length = 3, bytes = 0x323c3c}
无法将“NSConcreteMutableData”(0x204aff148)类型的值转换为“NSString”(0x204afde30)。

如何将字典中的“323c3c”作为没有长度和字节部分的简单字符串取出?我找不到太多关于“NSConcreteMutableData”类型的文档。我是否必须使用子字符串函数才能摆脱“length = x bytes =”部分?我猜有比手动获取子字符串更好的方法来做到这一点。谢谢。

【问题讨论】:

  • 您的字典是[String:Data] 类型。还有一些值不能用字符串表示,除非你更喜欢十六进制字符串。
  • NSConcreteMutableData,这是一个Data。长话短说,它实际上是一个NSMutableData,带有一个隐藏的Apple 实现以进行优化。但显然,将其视为Data 实例。如果您将其作为十六进制字符串,请参阅stackoverflow.com/questions/39075043/…

标签: swift dictionary nsstring nsdictionary


【解决方案1】:

正如 Vadian 所说,您的字典包含 Data 值。

看起来是 ASCII 编码的文本,但有点难以确定。

这一点:

31303732 31205761 6c6b6572 2053742e 20437970 72657373 2c204341 202c5553 412e

表示字符串“10721 Walker St. Cypress, CA ,USA”。当您将其视为 ASCII 时。

你可以使用这样的代码:

for (key, value) in terminalDict! {
    NSLog("key is now= \(key)")

    // Decode the data into a String assuming it's ASCII
    let asString = String(data: value, encoding: .ascii)

    NSLog("value is now= '\(asString)'")
    print(asString)
    NSLog("Adding \(key) \(asString)")
    newSettings = "\(newSettings)\(key)\(asString)"
  }

【讨论】:

  • 是的。这很有帮助。另一个问题:如果我想按原样(十六进制)获取其中的数据,而不转换为 ascii 字符串,我该怎么做?有这样做的本地方法吗? @Larme 建议添加扩展代码,有没有办法做到这一点?谢谢,邓肯。
  • 此线程包含一个数据扩展,它将数据转换为十六进制值字符串:stackoverflow.com/a/40089462/205185。你应该能够适应它。
  • 它是“原生的”,因为它使用带有格式字符串“%02hhX”的`String(format:)。
  • 请注意,它会生成大量的十六进制数字。您可能想要创建一个函数,以 4 位或 8 位数字的簇的形式输出十六进制值,中间有空格和换行符,以便更容易阅读。
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多