2015-11-03 2 views
0

У меня есть массив типа «drugList», и они являются производными от структуры «DrugsLibrary»:Как создать словарь из массива объектов в swift 2.1?

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 в словарь?

Буду признателен за любую помощь или предложение по этому вопросу.

ответ

1

вы можете использовать .map и .filter и Set в вашу пользу здесь. Сначала вы хотите массив словаря ключей, но не дублирует (так не использовать набор)

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, если требуется более мягкая функция, остается в качестве упражнения для чтения;).

У меня есть два несвязанных наблюдение:

1) Не уверен, что, если вы имели в виде его в качестве примера, или нет, но вы инициализируетесь dictionary с пустыми строками. Вам нужно будет удалить их в будущем, если вы не хотите вводить пустые строки. Вы лучше инициализирует пустой словарь с правильными типами:

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

2) Вам не нужно использовать self. для доступа к переменной экземпляра.Ваш код достаточно прост, что очень очевидно, что объем dictionary (см. Эту замечательную запись на self от Programmers's stack exchange post.

+0

Чувак это просто потрясающе !!!! Ваше решение сработало. Я пытаюсь решить это для дней! Спасибо, тонна! –

+1

Добро пожаловать! Это была забавная головоломка для решения. –

2

Вам нужно создать новый массив, содержащий содержимое предыдущего массива плюс новый элемент или новый массив плюс новый элемент и присвоить это в словарь:

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

Скопируйте этот в вашем 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) 
Смежные вопросы