swift - 将项目附加到字典

标签 swift linux

This问题不能解决我的问题。

我的目标是打印出一个 JSON 有效格式的字典,但我想通过 for 循环将项目添加到这个字典中。生成的 JSON 文件应如下所示:

"{
 "items": [{
   "name":"An Item"
   },{
     "name":"Item 2"
   }]
}" 

以下代码部分有效。

  func buildItem(name: String) -> [String:Any] {
    let action : [String: Any] = [
          "name": name
    ]
    return action
  }

  var items : [String: Any] = [:]
  for filename in filelist {
  items[filename] = buildItem(name: filename)
  }
  print (items) 

如果该目录有一个名为 test.md 的文件,则上面的返回:

["test.md": ["name": "test.md"]]

但是我希望它返回:

["items": ["name": "test.md"], ["name": "file2.md"]]

这样我就可以转换成有效的 JSON。

  • 如何将 buildItem 返回的条目添加到 items 中?

完整的代码可以在这个 pastebin 中找到.

最佳答案

所以问题在于您将 buildItem 的结果作为不同键的值添加到字典中,而不是将它们作为 items 的值附加到数组中键。

基本上,您想要的是 items["items"] = [array of buildItem results]

因此,您需要将 for 循环替换为

var items : [String: Any] = [:]
items["items"] = filelist.map { buildItem(name: $0) }

然后将字典序列化为数据并将其转换为字符串你可以简单地使用这个简单的扩展来扩展带有字符串键的字典

extension Dictionary where Key == String {

    func toPrettyJSON() throws -> String {

        let jsonData = try JSONSerialization.data(withJSONObject: self, 
                                             options: [.prettyPrinted])
        guard let jsonStr = String(data: jsonData, encoding: .ascii)
            else { throw NSError.init() }
        return jsonStr

    }

}

然后打印你的JSON

if let jsonStr = try? items.toPrettyJSON() {
   print(jsonStr)
}

here是整个代码

关于swift - 将项目附加到字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46498336/

相关文章:

linux - 如何从 Linux Jenkins master 重置内部版本号?

regex - 仅当匹配 X 时,才使用 sed 从字符串中删除前 N 个和最后 N 个字符

C++ TCP 服务器比较字符串失败

ios - 使用自动调整大小的单元格和不可滚动的表格时调整 tableView 高度

用于比较 tarball、SRPM 和源代码文件的 Linux 软件

ios - LoginView 和 NavigationDrawerController

xcode - 以不同的速率绘制多条散点线?

linux - CentOS7 中的 VPS,在启动我的 vps 时运行 Files JAVA

ios - ArrayBuffer.getElementSlowPath 有人遇到这个错误吗?

ios - swift:如何更新 NSUserDefault?