【问题标题】:How do I create a dictionary from an array of objects in swift 2.1?如何从 swift 2.1 中的对象数组创建字典?
【发布时间】:2015-11-03 17:01:14
【问题描述】:

我有一个“drugList”类型的数组,它们派生自一个结构“DrugsLibrary”:

struct DrugsLibrary {
    var drugName = ""
    var drugCategory = ""
    var drugSubCategory = ""
}

 var drugList = [DrugsLibrary]()
 //This is the dictionary i'm trying to build:
 var dictionary = ["": [""," "]]

我的数据模型是使用这个函数初始化的:

  func createDrugsList() {        
        var drug1 = DrugsLibrary()
        drug1.drugName = "drug1"
        drug1.drugCategory = "Antibiotics"
        drug1.drugSubCategory = "Penicillins"
        self.drugList.append(drug1)  

        var drug2 = DrugsLibrary()
        drug2.drugName = "drug2"
        drug2.drugCategory = "Antibiotics"
        drug2.drugSubCategory = "Penicillins"
        self.drugList.append(drug2) 

        var drug3 = DrugsLibrary()
        drug3.drugName = "drug2"
        drug3.drugCategory = "Antibiotics"
        drug3.drugSubCategory = "Macrolides"
        self.drugList.append(drug3) 
}

我的问题是我正在尝试从 drugList 创建一个字典,其中键是 drugSubCategory,值是药物名称。如果此子类别中有多种药物,则该值应该是一个数组 例如,本示例中的字典应如下所示:

 dictionary = [
     "Penicillins": ["drug1","drug2"]
     "Macrolides": ["drug3"]
    ] 

我试过这个方法:

   for item in drugList {
        dictionary["\(item.drugSubCategory)"] = ["\(item.drugName)"]            
    }

这给出了一个这样的字典,它不能将 drug2 附加到“Penicllins”:

 dictionary = [
     "Penicillins": ["drug1"]
     "Macrolides": ["drug3"]
    ] 

所以我尝试使用这种方法将项目附加到字典中,但它没有附加任何内容,因为数据模型中没有键为 "" 的公共项目:

for item in drugList {
  names1[item1.drugSubCategory]?.append(item1.drugName)  
  }

有人知道将 drug2 附加到字典中的方法吗?

如果在这件事上有任何帮助或建议,我将不胜感激。

【问题讨论】:

    标签: ios arrays swift dictionary


    【解决方案1】:

    您需要创建一个新数组,其中包含前一个数组的内容加上新项目或一个新数组加上新项目,并将其分配给您的字典:

    for item in drugList {
        dictionary[item.drugSubCategory] = dictionary[item.drugSubCategory] ?? [] + [item.drugName]
    }
    

    【讨论】:

      【解决方案2】:

      您可以在这里使用.map.filterSet 来发挥您的优势。首先你想要一个字典键数组,但不能重复(所以使用一个集合)

      let categories = Set(drugList.map{$0.drugSubCategory})
      

      然后您想遍历唯一的类别并找到该类别中的每种药物并提取其名称:

      for category in categories {
          let filteredByCategory = drugList.filter {$0.drugSubCategory == category}
          let extractDrugNames = filteredByCategory.map{$0.drugName}
          dictionary[category] = extractDrugNames
      }
      

      删除for 循环,如果需要更多的Swifty,留给读者作为练习;)。

      我有两个不相关的观察结果:

      1) 不确定您是否将其作为示例,但您已使用空字符串初始化 dictionary。除非您想要一个空字符串条目,否则您将来必须删除它们。你最好用正确的类型初始化一个空字典:

      var dictionary = [String:[String]]()
      

      2) 您不需要使用self. 来访问实例变量。您的代码很简单,很明显dictionary 的范围是什么(请参阅Programmers's stack exchange post. 中关于self 的这篇精彩文章

      【讨论】:

      • 伙计,这真是太棒了!!!!你的解决方案奏效了。这几天我一直在努力解决这个问题。非常感谢!
      【解决方案3】:

      将此复制到您的 Playground 中,可能会帮助您更好地理解字典:

       import UIKit
      
      var str = "Hello, playground"
      
      
      struct DrugsLibrary {
          var drugName = ""
          var drugCategory = ""
          var drugSubCategory = ""
      }
      
      var drugList = [DrugsLibrary]()
      //This is the dictionary i'm trying to build:
      var dictionary = ["":""]
      
      func createDrugsList() {
          var drug1 = DrugsLibrary()
          drug1.drugName = "drug1"
          drug1.drugCategory = "Antibiotics"
          drug1.drugSubCategory = "Penicillins"
          drugList.append(drug1)
      
          var drug2 = DrugsLibrary()
          drug2.drugName = "drug2"
          drug2.drugCategory = "Antibiotics"
          drug2.drugSubCategory = "Penicillins"
          drugList.append(drug2)
      
          var drug3 = DrugsLibrary()
          drug3.drugName = "drug2"
          drug3.drugCategory = "Antibiotics"
          drug3.drugSubCategory = "Macrolides"
          drugList.append(drug3)
      }
      
      createDrugsList()
      print(drugList)
      
      
      func addItemsToDict() {
      for i in drugList {
      
          dictionary["item \(i.drugSubCategory)"] = "\(i.drugName)"
      
      }
      }
      addItemsToDict()
      
      print(dictionary)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 2014-07-26
        • 1970-01-01
        相关资源
        最近更新 更多