Ios 如何从swift 2.1中的对象数组创建字典?

Ios 如何从swift 2.1中的对象数组创建字典?,ios,arrays,swift,dictionary,Ios,Arrays,Swift,Dictionary,我有一个类型为“drugList”的数组,它们派生自结构“DrugsLibrary”: 使用以下函数初始化我的数据模型: func createDrugsList() { var drug1 = DrugsLibrary() drug1.drugName = "drug1" drug1.drugCategory = "Antibiotics" drug1.drugSubCategory = "Penicillin

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

使用以下函数初始化我的数据模型:

  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) 
}
我的问题是,我试图从药物列表创建一个字典,其中键是drugSubCategory,值是drugname。如果此子类别中有多个药物,则该值应为数组 例如,在本例中,字典应如下所示:

 dictionary = [
     "Penicillins": ["drug1","drug2"]
     "Macrolides": ["drug3"]
    ] 
我试过这个方法:

   for item in drugList {
        dictionary["\(item.drugSubCategory)"] = ["\(item.drugName)"]            
    }
这给了一本这样的字典,它不能在“Penicllins”后面加上drug2:

因此,我尝试使用此方法将项目追加到字典中,但它没有追加任何内容,因为数据模型中没有键为“
的公共项目:

for item in drugList {
  names1[item1.drugSubCategory]?.append(item1.drugName)  
  }
有人知道如何在字典中添加drug2吗


如果您能在这方面提供任何帮助或建议,我将不胜感激。

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

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

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

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

在你的操场上抄写这篇文章,可能会帮助你更好地理解字典:

 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)

在你的操场上抄写这篇文章,可能会帮助你更好地理解字典:

 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)

您可以在此处使用
.map
.filter
Set
来发挥您的优势。首先,您需要一个字典键数组,但不需要重复项(因此请使用集合)

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

for category in categories {
    let filteredByCategory = drugList.filter {$0.drugSubCategory == category}
    let extractDrugNames = filteredByCategory.map{$0.drugName}
    dictionary[category] = extractDrugNames
}
如果需要更快速地删除
for
循环,则留给读者作为练习;)

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

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

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

2) 您不需要使用
self.
来访问实例变量。您的代码非常简单,很明显
字典
的范围是什么(请参阅
self
上的这篇伟大的文章,您可以使用
.map
.filter
设置
,这对您有利。首先,您需要一组字典键,但不能重复(因此请使用一组)

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

for category in categories {
    let filteredByCategory = drugList.filter {$0.drugSubCategory == category}
    let extractDrugNames = filteredByCategory.map{$0.drugName}
    dictionary[category] = extractDrugNames
}
如果需要更快速地删除
for
循环,则留给读者作为练习;)

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

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

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

2) 您不需要使用
self.
来访问实例变量。您的代码非常简单,很明显
字典的范围是什么(请看一位

老兄在
self
上写的这篇伟大的文章,这太棒了!!!!你的解决方案奏效了。我已经尝试解决这个问题好几天了。非常感谢!老兄,这太棒了!!你的解决方案奏效了。我已经尝试解决这个问题好几天了。非常感谢!