草庐IT

ios - 追加多维字典

coder 2023-09-15 原文

我有一个多维字典,我试图在不删除数据的情况下向其中添加数据,但如果重复则覆盖。

var items = [Int: AnyObject]()

var IdsAndDetails = [String:AnyObject]()
let index = 3 // static for test

...
for result in results {
     // result is String (result also indicates itemId)

     let details = self.IdsAndDetails[result]  
     // details is AnyObject like [String:String]

    if let itemDetails = details {        
         // Here I want to append data into 'items' variable

         // This doesn't work: (Error-1)
          self.items[index]![result] = itemDetails

    }

(错误 1):

Cannot assign to immutable expression to type AnyObject.


但是,如果我像这样尝试,它会起作用,但这不是我想要的方法。它正在重新创建字典。相反,我想附加数据。

      self.items = [
         index : [result : itemDetails]
      ]

我最终想要得到的字典结构是:

items = [
    index : [
        "id1" : ["key": "value", "key": "value"],
        "id2" : ["key": "val", "key": "val"],
        ],
    index : [
        "id3" : ["key": "val", "key": "val"],
        "id4" : ["key": "val", "key": "val"],
        "id5" : ["key": "val", "key": "val"],
    ]
]

// index is Integer
// [Key:Value] is [String:String] - itemDetails equal to all `[key:value]`s
// 'id' is also String

更新:我也试过了,但是没有成功

     let a = self.items[index]
     a![result]! = itemDetails as [String:String]

更新 2:

    let valueDict = (value as! NSDictionary) as Dictionary

    for (key, val) in valueDict {
        let keyString = key as! String
        let valString = val as! String

        self.items[index]![result]![keyString]! = valString
    }

但是它抛出错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

但令人惊讶的是调试显示所有值:

po index : 1
po itemId : "123123"
po keyString: "keyInString"
po valString: "valInString"

更新 3:

 for index in 1...5 {
   var results = [String]()

   // First I retrieve nearby users and assign it to key

   let itemsRef = Firebase(url: self.secret + "/items")
   eventsRef.queryOrderedByChild("user_id").queryEqualToValue(key).observeEventType(.ChildAdded, withBlock: { snapshot in
   // ^ above 'key' is the user_id retrieved before

   let itemDetails = snapshot.value // item details - [key:val, key:val]
   let itemId = snapshot.key        // item ids [id1,id2,id3]

   // I used 'KeyAndDetails' to store all values with ids 
   let IdsAndDetails = [itemId: itemDetails]

   self.itemIdsArray = []
   self.itemIdsArray.append(itemId)

   if index == 1 {
       // self.items = [
       //    index : [itemId : itemDetails]
       // ]
       // ^ This worked and gave me the structure
       // but I don't want to overwrite it, instead, I want to append
       // on the dictionary

       // This is where I am trying to append into `self.items`,
       // and throws error:
       self.items[index]?[result] = (eventDetails as! [String : String])
   }
  ...

最佳答案

您似乎试图绕过 Swift 的类型系统,而不是使用它。不要使用 AnyObject,您应该尝试使用您想要的确切类型作为该字典的值。在这种情况下,看起来你想要像 [Int: [String: [String: String]]] (尽管,就像@EricD 在评论中说的那样,你可能应该使用结构,如果可能的话)

这是一个类似于您问题中的代码的快速(静态)示例:

var items = [Int: [String: [String: String]]]()
let idsAndDetails = ["id2": ["key3": "value3"]]

let index = 3
items[index] = ["id1": ["key1": "value1", "key2": "value2"]]

let result = "id2"
if let itemDetails = idsAndDetails[result] {
    items[index]?[result] = itemDetails
}

最后,items 将是:

[3: ["id1": ["key1": "value1", "key2": "value2"], "id2": ["key3": "value3"]]]

items[index]?[result] 中的 ? 告诉 Swift 在尝试之前确保 items[index] 为非 nil执行下标方法。这样,如果您尝试更新 items 中不存在的 index,则不会导致崩溃。

关于ios - 追加多维字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37424640/

有关ios - 追加多维字典的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby - 如何在 Ruby 中获取多维哈希中的键? - 2

    因此,对于普通哈希,您可以使用它来获取key:hash.keys如何获取如下所示的多维哈希的第二维键:{""=>{"first_name"=>"test","last_name"=>"test_l","username"=>"test_user","title"=>"SalesManager","office"=>"test","email"=>"test@test.com"}}每个项目都是唯一的。所以我想从上面得到的键是:first_name,last_name,username,title,officeandemail 最佳答案

  8. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

  9. python - 将 Ruby 哈希字符串转换为 Python 字典 - 2

    我正在处理一些作为Ruby哈希字符串返回的命令输出。(来自名为mcollective的东西)。这是我收到的示例字符串:{:changes=>{"total"=>0},:events=>{"failure"=>0,"success"=>0,"total"=>0},:version=>{"puppet"=>"2.7.21(PuppetEnterprise2.8.1)","config"=>1381497648},:time=>{"filebucket"=>0.000287,"cron"=>0.00212,"package"=>0.398982,"exec"=>0.001314,"confi

  10. ruby - 如何在ruby中制作动态多维数组? - 2

    我有一个关于多维数组的初学者ruby​​问题。我想按年份和月份对条目进行排序。所以我想创建一个包含年->月->月条目的多维数组所以数组应该是这样的:2009->08->Entry1->Entry209->Entry32007->10->Entry5现在我有:@years=[]@entries.eachdo|entry|timeobj=Time.parse(entry.created_at.to_s)year=timeobj.strftime("%Y").to_imonth=timeobj.strftime("%m").to_itmparr=[]tmparrentry}@years.pu

随机推荐