Ios 如何从swift 2.1中的对象数组创建字典?
我有一个类型为“drugList”的数组,它们派生自结构“DrugsLibrary”: 使用以下函数初始化我的数据模型: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
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
上写的这篇伟大的文章,这太棒了!!!!你的解决方案奏效了。我已经尝试解决这个问题好几天了。非常感谢!老兄,这太棒了!!你的解决方案奏效了。我已经尝试解决这个问题好几天了。非常感谢!